Насколько принципиально отличаются двухтактные и стрелки FRP?

265

Я хочу изучать FRP в Haskell, но немного сложно выбрать библиотеку для использования. Многие из них кажутся мертвыми попытками, некоторые, похоже, воскрешены (например, недавняя активность на Ямпе).

Из того, что я прочитал, кажется, что есть два «вида» FRP: двухтактный FRP (как в Reactive-banana) с одной стороны и стрелочный FRP (как в Yampa) с другой стороны. Кажется, что во времена Fran и FrTime также был какой-то "классический FRP", но я не заметил какой-либо недавней активности в них.

  • Являются ли эти два (или три) действительно принципиально разными подходами FRP?

  • Является ли одна из них устаревшей теорией, в то время как другая станет «материалом будущего»?

  • Или они должны развиваться параллельно, решая разные задачи?

  • Я назвал наиболее выдающуюся библиотеку каждой категории или есть другие варианты для рассмотрения (Sodium, Netwire и др.)?


Наконец, я посмотрел выступление Эвана Чаплицкого, рекомендованное в комментариях Дж. Абрахамсона. Это очень интересно и помогло прояснить ситуацию для меня. Я настоятельно рекомендую его всем, кто нашел этот вопрос интересным.

Гийом Понсе
источник
5
Возможно, вас заинтересует мнение ertes (автора сети): stackoverflow.com/a/13344292/414413
Cirdec
14
Действительно быстро: reactive-bananaопределенно основано на двухтактных, а не двухтактных. reactiveдвухтактный Yampaи netwireстрелками. Существуют FRP, которые позволяют «накапливать значения», но не позволяют «переключение», FRP, которые допускают «переключение», но не «накапливают значения». Оба эти "простые" FRP. Arrowized FRP позволяет переключать и накапливать и использует стрелки, чтобы контролировать опасность объединения этих функций. Monadic FRP, как reactive-banana, sodiumи elereaиспользовать другие осторожные механизмы, чтобы гарантировать, что переключение и накопление не взаимодействуют слишком много.
Дж. Абрахамсон
12
Arrowized FRP также имеет удобную функцию, заключающуюся в том, что сигналы всегда указываются в контексте их входов, что позволяет вам преобразовывать выходы ковариантно и вводно контравариантно, чтобы лучше имитировать интерактивный FRP. Посмотрите подлинно функциональные пользовательские интерфейсы Кортни и Эллиотта для отличного примера этой функции.
Дж. Абрахамсон
9
Вас также может заинтересовать выступление автора « Elm» Эвана Чаплицкого «Управление временем и пространством» . По моему мнению, ему удается дать хороший обзор высокого уровня в области проектирования FRP и связанных с этим компромиссов.
DanielM
3
Я думаю, что вы получите ответ здесь .. stackoverflow.com/questions/10000074/…
Рашабх Шах,

Ответы:

18

Я отправился на Haskell.org для изучения вашего вопроса. Я нашел две важные статьи, которые вы должны прочитать, чтобы продолжить свое исследование, и я строю свой ответ на ваш вопрос из этих научных работ.

FRP Push-Pull от Конал Эллиот

Обобщая монады в стрелки Джон Хьюз


  1. Да, но также нет. Согласно Эллиоту, push - это оценка FRP, основанная на данных, а pull относится к так называемой оценке, основанной на спросе. Автор рекомендует тянуть, потому что толчок имеет тенденцию простаивать между входами данных. Вот в чем суть: push-pull объединяет и уравновешивает эти поведения для главной цели минимизации необходимости пересчитывать значения. Это просто; работа FRP с двухтактным ускоряет способность реагировать. Стрелка - это другой метод использования абстрактных типов для связывания значений и их одновременной оценки. Все эти понятия принципиально разные. Но не верьте мне на слово:

    Природа интерфейса Arrow проблематична для минимальной переоценки. Входные события и поведение объединяются в один вход, который затем изменяется при изменении любого компонента (Эллиотт).

    Таким образом, стрелка противоречит цели двухтактного. Это не означает, что вы не можете использовать все это сразу, просто это будет сложно, и есть некоторые вещи, которые вы не можете вычислить без абстрактных типов Arrow.

  2. Я не нашел научных мнений о том, какие подходы являются «путем будущего». Только обратите внимание, что стрелки могут справиться с одновременностью особенно хорошо. Если бы вы могли реализовать стрелки и использовать push-pull для минимизации вычислений, это был бы путь в будущее.

  3. Да, они направлены на разные цели. Как я уже сказал, их можно сформулировать вместе, но это сложно реализовать, и даже если это сработает, это, вероятно, сведет на нет преимущества реактивной скорости двухтактных.

  4. Это субъективно, но Reactive и Yampa являются наиболее часто цитируемыми языковыми библиотеками для FRP. Я бы сказал, что Reactive by Conal Elliott имеет глубокие корни, и Yampa также создана. Другие проекты, такие как Netwire, возникли в качестве замены, но может пройти некоторое время, прежде чем они заменят гигантов.


Надеюсь это поможет! Как я уже сказал, читая статьи, которые я указал, вы лучше поймете смысловую дистанцию ​​между стрелкой, толчком и толчком.

Кевин Караваджо
источник