id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
2661	Associated type synonyms not fully simplified in GHCi	kupopo		"The following code works as expected when compiled in GHC, or even when loaded into GHCi and run with ""main"":
{{{
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleContexts #-}

data Z = Z
data S n = S n

class Peano n where
    mkPeano :: n
    toInt   :: n -> Int

instance Peano Z where
    mkPeano = Z
    toInt Z = 0
instance Peano n => Peano (S n) where
    mkPeano = S mkPeano
    toInt (S n) = 1 + toInt n

class (Peano a, Peano b, Peano (Sum a b)) => BinOp a b where
    type Sum a b
instance BinOp Z Z where type Sum Z Z = Z
instance Peano a => BinOp Z (S a) where type Sum Z (S a) = S a
instance Peano a => BinOp (S a) Z where type Sum (S a) Z = S a
instance BinOp a b => BinOp (S a) (S b) where
    type Sum (S a) (S b) = S (S (Sum a b))

add :: BinOp a b => a -> b -> Sum a b
add _ _ = mkPeano

main = do
  print $ toInt $ add Z $ add Z Z
}}}

However, if the contents of main is typed at the GHCi prompt (toInt $ add Z $ add Z Z), it complains that {{{No instance for (BinOp Z (Sum Z Z)) arising from a use of `add' at <interactive>:1:8-12}}}.  Evidently it stops short before evaluating that Sum Z Z = Z and therefore BinOp Z Z is in fact an instance.  This is the case both in 6.8.3 as well as 6.10.0.20080921.

If ""seq 1"" is inserted, as in ""toInt $ seq 1 $ add Z $ add Z Z"", then GHCi again behaves consistently with GHC.  This is therefore a workaround, albeit inconvenient."	bug	closed	normal		GHCi	6.8.2	worksforme			Linux	x86						
