Монадическая карта канала разделяет поток

Я играю немного, пытаясь понять, 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 для какого-то случая Monadm, В обоих случаях вы используете id как эта функция, и, следовательно, любой вклад, который вы даете, рассматривается как b в первом примере и m b во-вторых. Так как значение, которое вы даете, имеет тип [Char], это разбивается на:

  • Первый пример - чистое преобразование списка символов.
  • Второй пример - монадическое преобразование для одного символа внутри монады списка.

Если вы хотите, чтобы второй пример вел себя так же, как первый, замените id с pure (или же return).

Другие вопросы по тегам