2013-06-24 10 views
28

Я хотел бы изучить концепцию, чтобы я мог понимать и использовать библиотеки, такие как machines.Какова концептуальная разница между машинами и проводниками (или другими подобными библиотеками)?

Я попытался следовать Rúnar Bjarnason's talk on machines, но информации слишком мало, в основном просто куча типов данных. Я даже не могу понять, что 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 и почему это количественно. Или, какова концептуальная разница между кабелепровод-подобными библиотеками и машинами?

ответ

44

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.

+1

Спасибо, не могли бы вы немного рассказать о 'k'? Почему 'Await' состоит из' k r', особенно, почему 'k :: * -> *' и параметризован 'r'? Я попытался рассмотреть «Tee», «Wye» и «Is», чтобы увидеть некоторые примеры разных 'k', но все же я далек от понимания этого. –

+4

'k a' - это тип запроса, который вы делаете, что подает вам данные. Результат «a» представляет результат запроса. «Await» эффективно имеет два аргумента: «Запрос с тем, что делать, если запрос завершен» и «что делать с сбоем». Для одного входа вы можете использовать k = (->) i', так что 'Machine ((->) i)' получает функцию от '(i -> r)', на которую вы можете поставить вход. С 'Tee' вы завершаете одну из двух функций, чтобы вы могли блокировать любой вход отдельно. 'Wye 'позволяет вам блокировать одно или оба входа одновременно. 'Is' используется как' (->) 'выше. –

+1

Еще один вопрос, почему есть 'Plan' и 'Machine'? Почему различие? –

 Смежные вопросы

  • Нет связанных вопросов^_^