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

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

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

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

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

  • Или они должны развиваться параллельно, обращаясь к разным целям?

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


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

Ответ 1

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

Push-Pull FRP от Conal Elliott

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


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

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

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

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

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

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


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