我正在尝试理解conduit
。运行
runConduit $ yield "abc" .| mapC id .| sinkList
在运行
时给出["abc"]
runConduit $ yield "abc" .| mapMC id .| sinkList
给出["a", "b", "c"]
。
为什么monadic版本会拆分流?
答案 0 :(得分:3)
这与这里的游戏类型有关。 mapC
期望a -> b
类型的函数,mapMC
期望a -> m b
Monad
的某个实例m
。在这两种情况下,您都使用id
作为该功能,因此您在第一个示例中将您提供的任何输入视为b
,并且m b
in第二。由于您所产生的价值属于[Char]
类型,因此细分为:
如果您希望第二个示例的行为与第一个示例相同,请将id
替换为pure
(或return
)。