[Haskell] Swapping parameters and type classes
Simon PeytonJones
simonpj at microsoft.com
Tue Sep 18 02:32:22 EDT 2007
This thread is certainly interesting, but it would be better on Haskellcafé@haskell.org. The Haskell at haskell.org list is intended as a lowbandwidth list for announcements and the like. Thanks!
Simon
 Original Message
 From: haskellbounces at haskell.org [mailto:haskellbounces at haskell.org]
 On Behalf Of Bas van Dijk
 Sent: 17 September 2007 20:17
 To: Mads Lindstrøm
 Cc: haskell at haskell.org
 Subject: Re: [Haskell] Swapping parameters and type classes

 On 9/17/07, Mads Lindstrøm <mads_lindstroem at yahoo.dk> wrote:
 > Hi Bas
 >
 > Thank you for the answer.
 >
 > I tried to "fill in some blanks" in the example you gave. And mostly
 got
 > a lot of context reduction stack overflows :(
 >
 > Here is my example (a little closer to what I actually need):
 >
 > data Foo a b = Foo { first :: a, second :: b }
 >
 > class Bar (x :: * > *) where
 > foo :: x a > a
 >
 > instance Bar (Foo a) where
 > foo x = second x
 >
 > type family BarB a b :: * > *
 > type instance BarB a b = Foo b
 >
 > instance Bar (BarB a b) where
 > foo x = second x  this unexpectedly works!
 >  foo x = first x  This unexpectedly gives context reduction
 stack overflow
 >
 > What surprises me is that I still need to look at `second`, even
 though
 > I use BarB. I thought I was swapping the parameters. Whats more
 changing
 > the line:
 >
 > type instance BarB a b = Foo b
 >
 > to
 >
 > type instance BarB a b = Foo a  the last letter changed
 >
 > has no effect.
 >
 >
 > Greetings,
 >
 > Mads Lindstrøm
 >
 > P.s. Why can we not just have the option of being explicit about
 which type parameters are applied? Something like:
 >
 > "instance Bar (apply a. Foo a b)" which would apply a and be
 identical to "instance Bar (Foo a)"
 > "instance Bar (apply b. Foo a b)" which would apply b and be what I
 am trying to achieve.
 >
 > It would seem a lot more natural to me. But maybe there are other
 reasons why type families are a better solution?
 >
 > I do not know if I use the right terminology when saying "apply".
 Please correct if there is more correct terms.
 >
 >
 > Bas van Dijk:
 > > On 9/16/07, Mads Lindstrøm <mads_lindstroem at yahoo.dk> wrote:
 > > > But what if I want to "apply" the 'b' ? How do I do that ?
 > >
 > > The following uses type families (functions) and compiles under GHC
 HEAD:
 > >
 > > {# OPTIONS_GHC XTypeFamilies XEmptyDataDecls 
 XTypeSynonymInstances #}
 > >
 > > data Foo a b
 > >
 > > class Bar (x :: * > *)
 > >
 > > instance Bar (Foo a)
 > >
 > > type family BarB a b :: * > *
 > > type instance BarB a b = Foo b
 > >
 > > instance Bar (BarB a b)
 > >
 > >
 > > regards,
 > >
 > > Bas van Dijk
 >
 >

 Mads, my sollution was not correct.

 This is why:

 instance Bar (BarB a b)

 is equal to:

 instance Bar (Foo b)

 which is just equal to:

 instance Bar (Foo a)

 The 'b' in 'instance Bar (Foo b)' has nothing to do with the 'b' in
 'Foo a b'. In fact the 'b' in 'BarB a b' is equal to the 'a' in 'Foo a
 b'.

 Sorry that I bothered you with this but like I said, it was late and I
 already consumed some wine. Not a good combination when programming
 ;)

 Bas.
 _______________________________________________
 Haskell mailing list
 Haskell at haskell.org
 http://www.haskell.org/mailman/listinfo/haskell
More information about the Haskell
mailing list