[haskell-cafe] Monad and kinds
Jake Mcarthur
jake.mcarthur at gmail.com
Tue Sep 2 09:46:56 EDT 2008
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
More information about the Haskell-Cafe
mailing list