如何在Haskell中组合List和State Monad

时间:2015-10-04 11:27:36

标签: haskell monad-transformers

我想基本上映射一个列表,同时携带一些状态。我认为结合列表和状态monad可能会让我在那里。我尝试了一些事情并发现我可能需要使用ListT。作为我实际问题的简化版本,假设我想实现sum函数,同时还返回原始列表的修改版本。这个或类似的是我想象的那样:

sum' :: ListT (State Int) Int
sum' = do
    lift $ put 0
    x <- [1,2,3]
    lift $ modify (+x)
    return $ x + 1

我还没有得到的是常规列表monad的语法如何转换为ListT monad。我不能简单地执行x <- [1,2,3],因为在箭头的右侧,预计会输入ListT (State Int) t0x <- return [1,2,3]编译(就像让编译器不抱怨这一行一样)但是把整个列表放到x中,而不是每个元素。

我该如何运作?

1 个答案:

答案 0 :(得分:4)

    x <- ListT $ return [1,2,3]

    x <- msum $ return <$> [1,2,3]

会做到这一点。

  • ListT . return只是将列表结构注入到列表转换的monad堆栈中。

  • msum使用ListT是将monad映射到其上的免费MonadPlus幺半群的变换器这一事实。