Я не знаком с RX, но относительно FRP и продолжения монады, они принципиально разные понятия.
Functional reactive programming - решение проблемы работы с зависящими от времени значениями и событиями. С помощью событий вы можете решить проблему обратного вызова, упорядочивая вычисления таким образом, чтобы при завершении события отправлялось событие и запускалось следующее. Но с обратными вызовами вы действительно не заботитесь о времени, вы просто хотите последовательно вычислять вычисления, поэтому, если ваша целая программа не основана на FRP, это не оптимальное решение.
continuation monad не имеет никакого отношения к времени вообще. Это абстрактная концепция вычислений, которая может (свободно говоря) принимать «моментальные снимки» текущей последовательности оценки и использовать их для «прыжка» на эти снимки произвольно. Это позволяет создавать сложные управляющие структуры, такие как петли и coroutines. Теперь рассмотрим определение продолжения монады:
newtype Cont r a = Cont { runCont :: (a -> r) -> r}
Это по существу функция с обратным вызовом! Это функция, которая принимает продолжение (обратный вызов), который продолжит вычисление после создания a
. Так что если у вас есть несколько функций, которые принимают продолжений,
f1 :: (Int -> r) -> r
f2 :: Int -> (Char -> c) -> c
f3 :: Char -> (String -> d) -> d
их состав становится несколько неаккуратно:
comp :: String
comp = f1 (\a -> f2 a (\b -> f3 b id))
Использование продолжений, он становится очень просто, нам нужно просто обернуть их в cont
, а затем последовательно их используя монадические связывают >>=
Отдела:
import Control.Monad.Cont
comp' :: String
comp' = runCont (cont f1 >>= cont . f2 >>= cont . f3) id
Так продолжения являются прямым решением callbac k проблема.
первый, что есть * callback-hell *?Во-вторых: вы говорите о FRP или о таких фреймворках, как RX (это * не * действительно реализация FRP) - также некоторые части (например, тип) cont-monad выглядят как событие (вы кормите обработчик событий), но, например, нет отписки (вы обычно находите в таких фреймворках, как RX), и обычно вы не добавляете более одного продолжения;) ... поэтому ИМО это не «одно и то же» ... но это мое мнение и может быть, это не подходящее место для таких дискуссий (?) – Carsten
вот хорошая картина о обратном вызове ад http://seajones.co.uk/content/images/2014/12/callback-hell.png – jhegedus
в видео Erik говорится, что RX является реализацией Cont. Монада, было бы хорошо знать «в простых терминах»/«объяснять простым смертным», почему и как это так. – jhegedus