Monadic管道地图拆分流

时间:2017-11-19 10:56:20

标签: haskell monads conduit

我正在尝试理解conduit。运行

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

在运行

时给出["abc"]
runConduit $ yield "abc" .| mapMC id .| sinkList

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

为什么monadic版本会拆分流?

1 个答案:

答案 0 :(得分:3)

这与这里的游戏类型有关。 mapC期望a -> b类型的函数,mapMC期望a -> m b Monad的某个实例m。在这两种情况下,您都使用id作为该功能,因此您在第一个示例中将您提供的任何输入视为b,并且m b in第二。由于您所产生的价值属于[Char]类型,因此细分为:

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

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