On Tue, Jun 5, 2012 at 2:25 PM, Gábor Lehel <illiss...@gmail.com> wrote:
> The encoded version would be:
>
> instance (f a b) => FMap f (HJust a) (HJust b)
>  where type f :<$>: (HJust a) = HJust b
>
> and I think this actually demonstrates a *different* limitation, namely that
>
>> The RHS of an associated type declaration mentions type variable `b'
>>   All such variables must be bound on the LHS
>
> which means that the standard encoding doesn't work for this case.

>From a reddit comment[1] by Reiner Pope it turns out you can actually do this:

instance (f a b) => FMap f (HJust a) (HJust b) where
    type f :<$>: (HJust a) = HJust (f :<$>: a)

A bit more awkward to write, but we're back to TFs not having any
expressivity problem in this department.

[1] 
http://www.reddit.com/r/haskell/comments/ut85i/a_few_typefamilies_nuggets/c4ygefh

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to