В чем принципиальная разница между машинами и кабелепроводами (или другими подобными библиотеками)?

Я хотел бы изучить концепцию, чтобы я мог понимать и использовать библиотеки, такие как машины.

Я пытался следить за речью Рунара Бьярнасона о машинах, но информации слишком мало, в основном просто набор типов данных. Я даже не могу понять что 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 типы оттуда.

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