| 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