Monadic 管道映射拆分流

Monadic conduit map splits the stream

我正在尝试理解 conduit。 运行

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

给出 ["abc"],而 运行

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

给出 ["a", "b", "c"].

为什么 monadic 版本会拆分流?

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

  • 第一个示例是对字符列表的纯转换
  • 第二个例子是对单个字符的单子转换,在列表 monad

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