【问题标题】:How to combine List and State Monad in Haskell如何在 Haskell 中结合 List 和 State Monad
【发布时间】:2015-10-04 19:56:56
【问题描述】:

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

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

我还不知道常规列表单子的语法如何转换为 ListT 单子。我不能简单地做x &lt;- [1,2,3],因为在箭头的右侧,需要输入ListT (State Int) t0x &lt;- return [1,2,3] 编译(因为这样可以防止编译器抱怨这一行)但让我将整个列表放入 x,而不是每个元素。

我如何让它工作?

【问题讨论】:

  • 你想要ssum xs = execState (traverse (modify . (+)) xs) 0吗?
  • 不幸的是,每当有人谈论ListT,你真的要问“哪一个?”因为有几个非常不同的版本,它们的行为非常不同。

标签: haskell monad-transformers


【解决方案1】:
    x <- ListT $ return [1,2,3]

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

会成功的。

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

  • msum 使用了 ListT 是将一个 monad 映射到它上面的免费 MonadPlus 幺半群的转换器。

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多