id summary reporter owner description type status priority milestone component version resolution keywords cc os architecture failure testcase blockedby blocking related differential
3346 Strange and incorrect type error when using rewrite rules with type families dreixel "The following code
{{{
{-# OPTIONS_GHC -fglasgow-exts -O1 #-}
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
}}}
gives the compilation error with GHC 6.11.20090703:
{{{
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""
}}}
I don't understand this error. rule2 seems unproblematic, though.
The similar code with functional dependencies
{{{
{-# 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
}}}
raises no errors.
" bug closed normal 6.12.1 Compiler 6.11 fixed Unknown/Multiple Unknown/Multiple typecheck/should_compile/T3346