conduit
и pipes
являются гораздо более зрелой, чем machines
, но - что сказал - machines
пытается взять другой путь, чем conduit
и pipes
.
С machines
, я пытаюсь относительно простой API в терминах аргументов типа. Оба conduit
и pipes
решили объединить все свои концепции, используя 5-6 переменных переменных типа.
Машины используют другой подход к параметризации машины (или Plan
) на своем «языке ввода», который ставит всю нагрузку на один дополнительный аргумент (или два в случае Plan
). Кроме того, выбирая возможность параметризации входного языка таким образом, он открывает возможности использования машин, которые могут принимать входные (не) детерминированные из нескольких источников входных данных. Результат - это просто бесплатная монада с дополнительной инструкцией «испускать»!
В обмен на несколько более строгую политику в отношении того, как вы создаете и используете машины, она может в конечном итоге обеспечить лучшую безопасность в отношении асимптотики полученного кода.
Это говорит, pipes
и conduit
было много реальной пользы мира и machines
более или менее площадка для меня, Runar Бьярнасон и Пол Chiusano.
В настоящее время он подходит для работы с входными данными, которые вы намерены потреблять полностью, но тем более для работы со сложными ресурсами или для синтаксического анализа, чем то, что вы получаете с этими двумя другими API.
Теперь, про этот квантификатор!
t
есть на самом деле экзистенциально количественно. Поступая таким образом, мы можем сделать Monad
для машин, которые не заботятся о функториальности параметра k
. Это важно из-за того, как реализован Source
. Если мне не нужно Source
работать, то мы могли бы использовать более простой
data Step k o r = Stop
| Yield o r
| Await (k r) r
Это будет иметь неприятный побочный эффект, что, когда вы пошли сочинить машину с Source
, что компилятор не будет знать, то, что выбрать, и вы будете купаться в ненужных аннотациях типа.
Экзистенциальная количественная оценка есть трюк, который я взял при работе с пакетом kan-extensions
. Это обобщение одного из типов Yoneda
.
Спасибо, не могли бы вы немного рассказать о 'k'? Почему 'Await' состоит из' k r', особенно, почему 'k :: * -> *' и параметризован 'r'? Я попытался рассмотреть «Tee», «Wye» и «Is», чтобы увидеть некоторые примеры разных 'k', но все же я далек от понимания этого. –
'k a' - это тип запроса, который вы делаете, что подает вам данные. Результат «a» представляет результат запроса. «Await» эффективно имеет два аргумента: «Запрос с тем, что делать, если запрос завершен» и «что делать с сбоем». Для одного входа вы можете использовать k = (->) i', так что 'Machine ((->) i)' получает функцию от '(i -> r)', на которую вы можете поставить вход. С 'Tee' вы завершаете одну из двух функций, чтобы вы могли блокировать любой вход отдельно. 'Wye 'позволяет вам блокировать одно или оба входа одновременно. 'Is' используется как' (->) 'выше. –
Еще один вопрос, почему есть 'Plan' и 'Machine'? Почему различие? –