{-# LANGUAGE FunctionalDependencies, FlexibleContexts #-} class C a where class D a where dop :: a -> a instance C a => D [a] where dop = undefined class J a b | a -> b where j :: a -> b -> () instance J Bool Int where j = undefined foo :: D [Int] => () foo = j True (head (dop [undefined])) main = return ()