|   1. mutual dependencies:
|       class Add x y z | x y -> z, x z -> y, y z -> x
|  
|  I think this example can be emulated with type functions; the
|  emulation didn't work with GHC 6.10, at least. It may work now.

On this point, it doesn't *quite* work yet.  The emulation you mention is 
something like this this:

        type family Arg1 a2 r :: *
        type family Arg2 a1 r :: *
        class (Arg2 x (R x y) ~ y, Arg1 y (R x y) ~ x) => Add x y where
          add :: x -> y -> R x y
          type R x y :: *

        type instance Arg1 Double Double= Int
        type instance Arg2 Int Double = Doulbe
        instance Add Int Double Double where
          add x y = toDouble x + y
          type R Int Double = Double

(The example you give is a bit odd because you specified that the types of any 
two arguments determine the third, which probably isn't what you want for Add.  
But no matter.)

What we need for this is equality superclasses.  I have done all the heavy 
lifting for this (see our paper "Practical aspects of compiling Haskell with 
System FC"), but I just need a few hours to get the payoff by switching them 
on.  Coming soon.

Simon

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

Reply via email to