Монадическая карта канала разделяет поток
Я играю немного, пытаясь понять, conduit
, Бег
runConduit $ yield "abc" .| mapC id .| sinkList
дает ["abc"]
, во время бега
runConduit $ yield "abc" .| mapMC id .| sinkList
дает ["a", "b", "c"]
,
Почему монадическая версия разделяет поток?
1 ответ
Решение
Это связано с типами в игре здесь. mapC
ожидает функцию типа a -> b
, в то время как mapMC
надеется a -> m b
для какого-то случая Monad
m
, В обоих случаях вы используете id
как эта функция, и, следовательно, любой вклад, который вы даете, рассматривается как b
в первом примере и m b
во-вторых. Так как значение, которое вы даете, имеет тип [Char]
, это разбивается на:
- Первый пример - чистое преобразование списка символов.
- Второй пример - монадическое преобразование для одного символа внутри монады списка.
Если вы хотите, чтобы второй пример вел себя так же, как первый, замените id
с pure
(или же return
).