Overlapping instances and multi-parameter classes

Given the following:
import Data.Maybe ( fromMaybe )
data None none = error "none evaluated" :: None
these class and instance declarations:
class ToMaybe2 b a where toMaybe2 :: a -> Maybe b instance ToMaybe2 a None where toMaybe2 = const Nothing instance ToMaybe2 a a where toMaybe2 = Just
compile fine (given -fallow-undecidable-instances and -fallow-overlapping-instances). And the following code:
mbPutStrLn :: ToMaybe2 String a => a -> IO () mbPutStrLn = putStrLn . fromMaybe "None." . toMaybe2 main = mbPutStrLn none >> mbPutStrLn "Hello, world!"
works as I'd expect. However, if the parameters to the class are reversed:
{- uncomment to see error message class ToMaybe1 a b where toMaybe1 :: a -> Maybe b instance ToMaybe1 None a where toMaybe1 = const Nothing instance ToMaybe1 a a where toMaybe1 = Just -}
I get the following error message (from GHC{,i} 6.2): Overlapping instance declarations: OverlapOrder.lhs:27: ToMaybe1 None a OverlapOrder.lhs:28: ToMaybe1 a a Why is this? thanks, mike
participants (1)
-
Mike Gunter