[Haskell-cafe] Combining State and List Monads

Edward Z. Yang ezyang at MIT.EDU
Sat Aug 25 07:51:40 CEST 2012

Hello Henry,

In such cases, it is often worth thinking about how you would implement
such a scheme manually, without using pre-existing monads.  You will
quickly see that the two candidate types:

    s -> ([a], s)
    [s -> (a, s)]

both will not work (exercise: what semantics do they give?)  In fact,
you must use continuation passing style, and you must "resume" the
computation with the latest state value you would extracted from the
last run.  See the LogicT monad for how to implement list-like monads in
continuation passing style.


Excerpts from Henry Laxen's message of Sat Aug 25 00:35:37 -0400 2012:
> Dear Cafe,
> It seems to me there should be some simple way of doing this, but thus
> far it eludes me.  I am trying to combine the State and List monads to
> do the following:
> countCalls = do
>   a <- [1..2]
>   b <- [1..2]
>   modify (+1)
>   return (a,b)
> where with some combination of ListT, StateT, List, State, or who
> knows what would result in:
> ([(1,1),(1,2),(2,1),(2,2)],4)
> assuming we initialize the state to 0
> Is there any way to make this happen?
> Thanks in advance.
> Henry Laxen

More information about the Haskell-Cafe mailing list