
On Tue, Feb 07, 2006 at 05:54:51PM -0800, Ashley Yakeley wrote:
John Meacham wrote:
newtype Eq a => Set a = Set (List a) singleton :: Eq a => a -> Set a class Monad m where return :: a -> m a
instance Monad Set where return x = singleton x
okay, our goal is to make this typesafe.
You shouldn't be able to, should you? Monad makes a promise that Set can't keep. In particular:
returnid :: (Monad m) => m (a -> a) returnid = return id
bad :: Set (a -> a) bad = returnid
however, (Set (a -> a)) is malformed. since a _requirement_ is that Set can only be applied to a type with an Eq constraint so the instance you try to do something like returnid :: Set (a -> a) -- ^ static error! you need returnid :: Eq (a -> a) => Set (a -> a) the instant you introduce 'Set' you introduce the 'Eq' constraint. as long as you are just working on generic monads then there is no need for the Eq constraint. John -- John Meacham - ⑆repetae.net⑆john⑈