{-# 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

{- -- 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 ""

