On Sep 2, 2008, at 8:34 AM, Ramin wrote:
instance Monad Query where
return (initState, someRecord) = Query (initState, someRecord)
{- code for (>>=) -}
GHC gives an error, "Expected kind `* -> *', but `Scanlist_ctrl' has
kind `* -> * -> *' ".
I believe you understand the problem with the above code, judging from
your attempt to fix it below.
If I try this:
instance Monad (Query state) where
return (initState, someRecord) = Query (initState, someRecord)
{- code for (>>=) -}
GHC give an error, "Occurs check: cannot construct the infinite
type: a = (s, a) when trying to generalise the type inferred for
`return' ".
The problem is your type for the return function. The way you have
written it, it would be `return :: (state, rec) -> Query state rec`.
Perhaps it would be easier to see the problem if we defined `type M =
Query MyState`. Then you have `return :: (MyState, rec) -> M rec`.
Compare this to the type it must be unified with: `return :: a -> m
a`. The two 'a's don't match! The type you are after is actually
`return :: rec -> M rec` or `return :: rec -> Query state rec`.
I hope this helps lead you in the right direction. I'm not giving you
the solution because it sounds like you want to solve this for
yourself and learn from it.
- Jake McArthur
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe