我正在尝试理解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/