[Haskell-cafe] Re: Fwd: Re: Simple game: a monad for each player
Heinrich Apfelmus
apfelmus at quantentunnel.de
Mon Apr 19 09:02:16 EDT 2010
Heinrich Apfelmus wrote:
> Limestraël wrote:
>> Okay, I start to understand better...
>>
>> Just, Heinrich, how would implement the mapMonad function in terms of the
>> operational package?
>> You just shown the signature.
>
> Ah, that has to be implemented by the library, the user cannot implement
> this. Internally, the code would be as Bertram suggests:
>
> mapMonad :: (Monad m1, Monad m2)
> => (forall a . m1 a -> m2 a)
> -> ProgramT instr m1 a -> ProgramT instr m2 a
> mapMonad f (Lift m1) = Lift (f m1)
> mapMonad f (Bind m k) = Bind (mapMonad f m) (mapMonad f . k)
> mapMonad f (Instr i) = Instr i
Silly me! This can be implement by the user:
mapMonad f = id' <=< lift . f . viewT
where
id' :: ProgramViewT instr m1 a -> ProgramT instr m2 a
id' (Return a) = return a
id' (i :>>= k) = singleton i >>= mapMonad f . k
and it would be a shame for the operational approach if that were not
possible. :)
Regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
More information about the Haskell-Cafe
mailing list