{-# OPTIONS_GHC -fglasgow-exts -O1 #-} -- Bug report http://hackage.haskell.org/trac/ghc/ticket/3346 module Main where --{-# RULES "rule1" forall x. to (from x) = x #-} {-# RULES "rule2" forall x. from (to x) = x #-} class EP a where type Result a from :: a -> Result a to :: Result a -> a {- -- Uncommenting rule1 above gives the error: Couldn't match expected type `Result a' against inferred type `Result a' NB: `Result' is a type function, and may not be injective In the first argument of `to', namely `(from x)' In the expression: to (from x) When checking the transformation rule "rule1" -} -- However, this is fine {-# RULES "rule3" forall x. to' (from' x) = x #-} {-# RULES "rule4" forall x. from' (to' x) = x #-} class EP' a b | a -> b where from' :: a -> b to' :: b -> a main = print ""