В чем принципиальная разница между машинами и кабелепроводами (или другими подобными библиотеками)?
Я хотел бы изучить концепцию, чтобы я мог понимать и использовать библиотеки, такие как машины.
Я пытался следить за речью Рунара Бьярнасона о машинах, но информации слишком мало, в основном просто набор типов данных. Я даже не могу понять что k
в
newtype Machine k o = Step k o (Machine k o)
data Step k o r = Stop
| Yield o r
| forall t . Await (t -> r) (k t) r
или что t
и почему это количественно. Или какова концептуальная разница между подобными проводнику библиотеками и машинами?
1 ответ
conduit
а также pipes
оба гораздо более зрелые, чем machines
, но - что сказал - machines
пытается пойти по другому пути, чем conduit
а также pipes
,
С machines
Я пытаюсь относительно простой API с точки зрения аргументов типа. И то и другое conduit
а также pipes
решили объединить все свои концепции, используя 5-6 аргументов переменных разных типов.
Машины используют другой подход параметризации машины (или Plan
) на его "языке ввода", который возлагает всю ответственность на один дополнительный аргумент (или два в случае Plan
). Кроме того, выбор параметризации языка ввода таким способом открывает возможности использования машин, которые могут принимать (не) детерминистически входные данные из нескольких источников ввода. В результате получается просто бесплатная монада с дополнительной инструкцией 'emit'!
В обмен на чуть более строгую политику в отношении того, как вы создаете и используете машины, она может в конечном итоге обеспечить большую безопасность в отношении асимптотики полученного кода.
Это сказало, pipes
а также conduit
было много реального использования и machines
Для меня это более или менее игровая площадка, Рунар Бьярнасон и Пол Кьюзано.
В настоящее время он подходит для работы с вводом, который вы собираетесь использовать целиком, но в меньшей степени для работы со сложными ресурсами или для анализа, чем то, что вы получаете с этими двумя другими API.
Теперь про этот квантификатор!
t
там на самом деле экзистенциально количественно. Тем самым мы можем сделать Monad
для машин не заботится о функциональности k
параметр. Это важно из-за способа Source
реализовано. Если бы я не нуждался Source
работать, то мы могли бы использовать более простой
data Step k o r = Stop
| Yield o r
| Await (k r) r
Это будет иметь неприятный побочный эффект, что, когда вы пошли, чтобы создать машину с Source
что компилятор не знает что Functor
экземпляр, чтобы выбрать, и вы будете плавать в ненужных аннотаций типа.
Экзистенциальная количественная оценка есть трюк, который я подобрал, работая над kan-extensions
пакет. Это обобщение одного из Yoneda
типы оттуда.