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
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to