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