Я хочу изучать FRP в Haskell, но немного сложно выбрать библиотеку для использования. Многие из них кажутся мертвыми попытками, некоторые, похоже, воскрешены (например, недавняя активность на Ямпе).
Из того, что я прочитал, кажется, что есть два «вида» FRP: двухтактный FRP (как в Reactive-banana) с одной стороны и стрелочный FRP (как в Yampa) с другой стороны. Кажется, что во времена Fran и FrTime также был какой-то "классический FRP", но я не заметил какой-либо недавней активности в них.
Являются ли эти два (или три) действительно принципиально разными подходами FRP?
Является ли одна из них устаревшей теорией, в то время как другая станет «материалом будущего»?
Или они должны развиваться параллельно, решая разные задачи?
Я назвал наиболее выдающуюся библиотеку каждой категории или есть другие варианты для рассмотрения (Sodium, Netwire и др.)?
Наконец, я посмотрел выступление Эвана Чаплицкого, рекомендованное в комментариях Дж. Абрахамсона. Это очень интересно и помогло прояснить ситуацию для меня. Я настоятельно рекомендую его всем, кто нашел этот вопрос интересным.
источник
reactive-banana
определенно основано на двухтактных, а не двухтактных.reactive
двухтактныйYampa
иnetwire
стрелками. Существуют FRP, которые позволяют «накапливать значения», но не позволяют «переключение», FRP, которые допускают «переключение», но не «накапливают значения». Оба эти "простые" FRP. Arrowized FRP позволяет переключать и накапливать и использует стрелки, чтобы контролировать опасность объединения этих функций. Monadic FRP, какreactive-banana
,sodium
иelerea
использовать другие осторожные механизмы, чтобы гарантировать, что переключение и накопление не взаимодействуют слишком много.Ответы:
Я отправился на Haskell.org для изучения вашего вопроса. Я нашел две важные статьи, которые вы должны прочитать, чтобы продолжить свое исследование, и я строю свой ответ на ваш вопрос из этих научных работ.
FRP Push-Pull от Конал Эллиот
Обобщая монады в стрелки Джон Хьюз
Да, но также нет. Согласно Эллиоту, push - это оценка FRP, основанная на данных, а pull относится к так называемой оценке, основанной на спросе. Автор рекомендует тянуть, потому что толчок имеет тенденцию простаивать между входами данных. Вот в чем суть: push-pull объединяет и уравновешивает эти поведения для главной цели минимизации необходимости пересчитывать значения. Это просто; работа FRP с двухтактным ускоряет способность реагировать. Стрелка - это другой метод использования абстрактных типов для связывания значений и их одновременной оценки. Все эти понятия принципиально разные. Но не верьте мне на слово:
Таким образом, стрелка противоречит цели двухтактного. Это не означает, что вы не можете использовать все это сразу, просто это будет сложно, и есть некоторые вещи, которые вы не можете вычислить без абстрактных типов Arrow.
Я не нашел научных мнений о том, какие подходы являются «путем будущего». Только обратите внимание, что стрелки могут справиться с одновременностью особенно хорошо. Если бы вы могли реализовать стрелки и использовать push-pull для минимизации вычислений, это был бы путь в будущее.
Да, они направлены на разные цели. Как я уже сказал, их можно сформулировать вместе, но это сложно реализовать, и даже если это сработает, это, вероятно, сведет на нет преимущества реактивной скорости двухтактных.
Это субъективно, но Reactive и Yampa являются наиболее часто цитируемыми языковыми библиотеками для FRP. Я бы сказал, что Reactive by Conal Elliott имеет глубокие корни, и Yampa также создана. Другие проекты, такие как Netwire, возникли в качестве замены, но может пройти некоторое время, прежде чем они заменят гигантов.
Надеюсь это поможет! Как я уже сказал, читая статьи, которые я указал, вы лучше поймете смысловую дистанцию между стрелкой, толчком и толчком.
источник