{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} -- !!! Functional dependencies module Main where class Foo a b | a -> b where foo :: a -> b instance Foo [a] (Maybe a) where foo [] = Nothing foo (x:_) = Just x instance Foo (Maybe a) [a] where foo Nothing = [] foo (Just x) = [x] test3:: [a] -> [a] test3 = foo . foo -- First foo must use the first instance, -- second must use the second. So we should -- get in effect: test3 (x:xs) = [x] main:: IO () main = print (test3 "foo")