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

Reply via email to