apfelmus wrote: > Maxime Henrion wrote: > > apfelmus wrote: > >> Maxime Henrion wrote: > >>> class MonadState m where > >>> type StateType m :: * > >>> get :: m StateType > >>> put :: m StateType -> m () > >>> > >>> As for instances: > >>> > >>> instance MonadState (State s) where > >>> type StateType = s -- this is line 22 > >> When defining the type function StateType, you have to give it the > >> required argument m = State s: > >> > >> type StateType (State s) = s > >> > >>> get = State $ \s -> (s, s) > >>> put s = State $ \_ -> ((), s) > > > > I tried that too already, it gives: > > > > State.hs:19:39: > > Kind mis-match > > Expected kind `k -> *', but `()' has kind `*' > > In the type `m ()' > > In the type `m StateType -> m ()' > > In the class declaration for `MonadState' > > Ah, oh, I didn't even check whether the types in the class are good. I'm > not sure, but don't you want > > class MonadState m where > type StateType m :: * > get :: m (StateType m) > put :: StateType m -> m () > > ? Then, the substitutions m = State s and StateType (State s) = s yields > the expected types for put and get: > > get :: (State s) s > put :: s -> (State s) ()
Ah, I tried something like that too, and then I get errors in the definition of the instance : State.hs:23:19: Couldn't match expected type `StateType (State s)' against inferred type `s' (a rigid variable) `s' is bound by the instance declaration at State.hs:21:27 Expected type: State s (StateType (State s)) Inferred type: State s s In the expression: State $ (\ s -> (s, s)) In the definition of `get': get = State $ (\ s -> (s, s)) State.hs:24:19: Couldn't match expected type `s' (a rigid variable) against inferred type `StateType (State s)' `s' is bound by the instance declaration at State.hs:21:27 Expected type: State s () Inferred type: State (StateType (State s)) () In the expression: State $ (\ _ -> ((), s)) In the definition of `put': put s = State $ (\ _ -> ((), s)) I would expect GHC to see that 'State s (StateType (State s))' is the same as 'State s s', per the definition of StateType. I'm not sure how to express get differently so that it matches, and similarly for put. If I write: get = State $ \s -> (StateType (State s), s) I get: State.hs:23:34: Not in scope: data constructor `StateType' Thanks, Maxime _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe