[prev in list] [next in list] [prev in thread] [next in thread]
List: haskell-beginners
Subject: Re: [Haskell-beginners] how do typeclasses work again?
From: "Nicholls, Mark" <nicholls.mark () vimn ! com>
Date: 2017-02-12 10:05:53
Message-ID: E7E7FDF32472FF48BB0E4D9DC4283D0E8BD0930B () mtvne-exmb02 ! mtvne ! ad ! viacom ! com
[Download RAW message or body]
I'm naively capable of messing around with type families...so I know how to define \
the types statically...that's not really what I want...that's too strong.
I think I'm trying to work in the universe of typeclasses and not data types....in my \
OO head these two things overlap (if you see what I mean)....in Haskell they are \
distinct...which I'm beginning to feel makes type inference easy....but is actually \
quite "weak".
so lets start again...
> class Is isx x where
> apply ::(x -> y) -> isx -> y
> instance Is x x where
> apply f = f
i.e. lets create our tuple instance like this!
> instance (Is m x) => Is (m,y) x where
> apply f (m,y) = apply f m
> data X = X deriving (Show)
> data Y = Y deriving (Show)
> foo4 :: forall a isx. (Is isx a, Show a) => isx -> String
> foo4 = apply (\(i :: a) -> show i)
now...this line said....
> main = print (foo4 @X (X,Y))
and that works!....which I think is what I want....in an OO world this feels like a \
"cast"....where Ive said (X,Y) <: X....I'm getting the compiler to extract fst for \
me...I'm lazy.
so lets tell the compiler it could do snd for me.
> instance (Is m x) => Is (y,m) x where
> apply f (y,m) = apply f m
gives....."Duplicate instance declarations "
which is unfortunate as I wanted to then write
> main = print (foo4 @Y (X,Y))
to "cast" to Y....which feels perfectly reasonable
then I look this up on the interweb...and magically found some noob has been here \
before! "noob "Duplicate instance declarations" (again)"
that noob was me!...about a year ago...and someone said I was misunderstanding how to \
define these sort of recursive structures....and It should be done in the class \
declaration...which doesn't seem to work in this case...as I want to do something \
recursive
the answer said.....
"Haskell requires that there be only one instance for each class and type. Thus is \
determined only from the part to the right of the =>. "
ok, I buy that...IF I want to guarantee Haskell to automatically derive type class \
dictionaries that functional restriction is perfectly reasonable...as long as its \
resolved at some point.
I tbink (naively)...Haskell is saying...
"if I match things against (x,y) I've got 2 instance declarations....so how do I \
decide which one?"
what I'm saying is....that's fine but I'm telling you which one at the call \
site....using these "@" things...
so what's the problem?...the functional restriction is too restrictive.
________________________________________
From: Beginners [beginners-bounces@haskell.org] on behalf of Sylvain Henry \
[sylvain@haskus.fr]
Sent: 11 February 2017 13:36
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] how do typeclasses work again?
On 11/02/2017 09:50, Nicholls, Mark wrote:
> I don't understand the difference
>
> forall a isx. (Is isx a, Show a) => isx -> String
> and
> (Is isx a, Show a) => isx -> String
I have used the `forall` explicitly only to fix the order of the type
parameters (`a` and `isx`) so that we are sure to set the type of `a`
when we write (using TypeApplications): foo4 @Y (X,Y)
In the second declaration, the `forall` is implicit.
> I think my understanding of type classes is naïve, I just thought it meant that \
> secretly a dictionary was being passed.
Yes your understanding is correct. The issue here is that the compiler
doesn't know the type of `a`, hence it can't select and pass the
appropriate instances.
> the compiler would identify the specific dictionary from the call site
Even at call site, the compiler can't infer the `a` type from the `isx`
type (nor from the return type of `foo4`).
Do you want the `a` type to be dependent on the `isx` type? I.e., to
only be allowed to define a single `Is isx a` instance for each `isx` type.
--
Sylvain
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
CONFIDENTIALITY NOTICE
This e-mail (and any attached files) is confidential and protected by copyright (and \
other intellectual property rights). If you are not the intended recipient please \
e-mail the sender and then delete the email and any attached files immediately. Any \
further use or dissemination is prohibited.
While MTV Networks Europe has taken steps to ensure that this email and any \
attachments are virus free, it is your responsibility to ensure that this message and \
any attachments are virus free and do not affect your systems / data.
Communicating by email is not 100% secure and carries risks such as delay, data \
corruption, non-delivery, wrongful interception and unauthorised amendment. If you \
communicate with us by e-mail, you acknowledge and assume these risks, and you agree \
to take appropriate measures to minimise these risks when e-mailing us.
MTV Networks International, MTV Networks UK & Ireland, Greenhouse, Nickelodeon Viacom \
Consumer Products, VBSi, Viacom Brand Solutions International, Be Viacom, Viacom \
International Media Networks and VIMN and Comedy Central are all trading names of MTV \
Networks Europe. MTV Networks Europe is a partnership between MTV Networks Europe \
Inc. and Viacom Networks Europe Inc. Address for service in Great Britain is 17-29 \
Hawley Crescent, London, NW1 8TT.
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic