Есть ли "полный" набор функций / операторов для FRP?
Функциональное реактивное программирование - это подход к определению побочных программ чисто функциональным способом.
Недавно я использовал rxscala, который является портом порта Java/Scala ReactiveX. Он основан на концепции Observable
s, которые можно рассматривать как потоки значений определенного типа.
Для этого вопроса я хочу исключить подходы FRP, которые обрабатывают непрерывные изменения (сигналы).
Создание новых Обсерваторий из старых
Эти наблюдаемые могут быть объединены с использованием множества различных функций для создания новых наблюдаемых. Они похожи на функции, которые можно применять к коллекциям. И это уже достаточно хорошо понято, как мы знаем Foldable
, Traversable
, Applicative
, Monads
и тому подобное.
Действительно, наблюдаемые - это складные, проходимые монады, как обычные коллекции. Но эти признаки могут быть реализованы несколькими способами для наблюдаемых, так как наблюдаемая содержит гораздо больше информации (информация о времени для каждого элемента), чем обычная коллекция. И результат также должен быть снабжен информацией о времени.
Две реализации Monad
Например монадический join
(flatMap
в Scala) могут быть реализованы по крайней мере двумя различными, вероятными способами:
От
switch
переход между вложенными наблюдаемыми, что приводит к обрезанию текущей активной наблюдаемой, как только следующая начинает излучение, илиhttp://reactivex.io/documentation/operators/images/switch.c.png
от
merge
во вложенных наблюдаемых объектах без отбрасывания или задержки каких-либо событий.http://reactivex.io/documentation/operators/images/mergeDelayError.C.png
... и многое, многое другое (см. комментарии)
Ограничения
Я очень доволен предоставленным репертуаром функций комбинатора, но я продолжаю сталкиваться с ситуациями, когда я не могу достичь того, чего хочу, и мне приходится прибегать к некоторому параллельному программированию.
Пропали комбинаторы или мозги?
Теперь мне интересно, слишком ли я глуп, чтобы строить желаемое поведение, используя существующие комбинаторы. Или это тот случай, когда функции комбинатора, доступные в rxscala, недостаточны для создания любого мыслимого поведения?
Вопрос
Я прошу доказательства того, что какой-то базовый набор комбинационных функций B
достаточно создать "все мыслимые наблюдаемые" из некоторых входных наблюдаемых.
Возможно, самой сложной частью может быть определение "все мыслимые наблюдаемые". Возможно сообщество Haskell произвело что-то подобное?
1 ответ
Проверьте это сообщение в блоге и это видео. Там Барт де Смет предлагает минимальный набор операций, который может построить любой другой оператор. Я думаю, из соображений производительности, вероятно, не следует пытаться реализовать каждый оператор с помощью основных операторов, но для некоторых это интересное упражнение.