{-# OPTIONS_GHC -XTypeFamilies #-} -- Trac #3346 module Foo where class EP a where type Result a from :: a -> Result a to :: Result a -> a {-# RULES "rule1" forall x. to (from x) = x #-} {-# RULES "rule2" forall x. from (to x) = x #-} foo :: EP a => a -> a -- This is typed in a way rather similarly to RULE rule1 foo x = to (from x) bar x = from (to x)