John Meacham wrote:
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.
OK, try this:
foo :: (Monad m) => m Int
foo = return id >>= (\i -> i 7)
fooSet :: Set Int
fooSet = foo
Since we have (Eq Int), your type-checker should allow this. But your
instance implementation of return and (>>=) made assumptions about their
arguments that foo does not stick to.
--
Ashley Yakeley
_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://haskell.org/mailman/listinfo/haskell-prime