haskell - Monadic 管道图分割流

标签 haskell monads conduit

我正在尝试理解conduit。运行

runConduit $ yield "abc" .| mapC id .| sinkList

在运行时给出["abc"]

runConduit $ yield "abc" .| mapMC id .| sinkList

给出[“a”,“b”,“c”]

为什么单子(monad)版本要分割流?

最佳答案

这与这里起作用的类型有关。 mapC 需要一个 a -> b 类型的函数,而 mapMC 需要 a -> m b 的某些实例Monad m。在这两种情况下,您都使用 id 作为该函数,因此您提供的任何输入在第一个示例中都将被视为 b ,而 m b 在第二个。由于您生成的值的类型为 [Char],因此可分解为:

  • 第一个示例是对字符列表的纯转换
  • 第二个示例是列表 monad 内单个字符的 Monadic 转换

如果您希望第二个示例的行为与第一个示例相同,请将 id 替换为 pure(或 return)。

关于haskell - Monadic 管道图分割流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47376039/

相关文章:

haskell - 从 Network.HTTP.Enumerator 迁移到 Network.HTTP.Conduit

haskell - 如何从输入文件流式传输到具有状态的管道

list - 在新行中打印列表元素

haskell - 在 Ubuntu 12.04 上勇敢面对阴谋 hell

haskell - 应用 <* 的一元等价物

haskell - 为什么我们需要 Maybe Monad 而不是 Monad

haskell - 非确定性交错管道的来源

haskell - 控制台中的简单进度指示

haskell - 如何使 MonadRandom 成为仿函数?

haskell - 管道的上游类型参数的真正好处是什么?