[Haskell-cafe] Re: GHC 6.7 and Associated Types

apfelmus apfelmus at quantentunnel.de
Tue Apr 17 07:47:38 EDT 2007


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) ()


Regards,
apfelmus



More information about the Haskell-Cafe mailing list