Monadic conduit map разделяет поток

Я немного балуюсь, пытаясь понять conduit. Бег

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

дает ["abc"] во время работы

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

дает ["a", "b", "c"].

Почему монадическая версия разделяет поток?


person jorgen    schedule 19.11.2017    source источник


Ответы (1)


Это связано с типами, которые здесь играют. mapC ожидает функцию типа a -> b, тогда как mapMC ожидает a -> m b для некоторого экземпляра Monad m. В обоих случаях вы используете id в качестве этой функции, и поэтому любые входные данные, которые вы вводите, обрабатываются как b в первом примере и m b во втором. Поскольку значение, которое вы возвращаете, имеет тип [Char], это разбивается на:

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

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

person Michael Snoyman    schedule 19.11.2017