
On Tue, Feb 07, 2006 at 10:04:35AM +0100, Georg Martius wrote:
From the users point of view, the implementation in GHC works quite well and a lot people use it. It would be a pity if they are not included in the new standard. What is the problem of specifying what is implemented.
They work well most of the time, but people keep discovering strange behaviour around the edges. For example, the following (example 6 of Sulzmann et al) sends GHC into a loop: class Mul a b c | a b -> c where (.*.) :: a -> b -> c instance Mul Int Int Int where (.*.) = (*) instance Mul Int Float Float where x .*. y = fromIntegral x * y instance Mul a b c => Mul a [b] [c] where x .*. v = map (x.*.) v f = \ b x y -> if b then x .*. [y] else y Noone knows how to specify them (short of pointing at GHC, which won't do). The closest is Sulzmann et al, which makes the problems clearer.