首页 文章

如何在Haskell中组合List和State Monad

提问于
浏览
3

我想基本上映射一个列表,同时携带一些状态 . 我认为结合列表和状态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) t0 . x <- return [1,2,3] 编译(就像让编译器不要抱怨这一行)但是让我把整个列表放到x中,而不是每个元素 .

我该如何工作?

1 回答

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

    要么

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

    会做的 .

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

    • msum 使用 ListT 是将monad映射到其上的free MonadPlus monoid的转换器这一事实 .

相关问题