gpt4 book ai didi

haskell - Continuation Monad 为什么以及如何解决回调 hell ?换句话说: Is RX or FRP = Continuation Monad ? IF not =,有什么区别?

转载 作者:行者123 更新时间:2023-12-01 15:02:57 28 4
gpt4 key购买 nike

Herehere据说Continuation Monad解决了回调 hell 。

RX 和 FRP 也解决了回调 hell 。

如果所有这三个工具都解决了回调 hell ,那么就会出现以下问题:

在 Erik 的视频中,据说 RX=Continuation Monad。这是真的吗?如果是,你能显示映射吗?

如果 RX 不是 = 继续。 Monad 那么 RX 和 Continuation Monad 有什么区别呢?

同样,FRP 和 Continuation Monad 有什么区别?

换句话说,假设读者知道 FRP 或 RX 是什么,那么读者如何容易理解 Continuation Monad 是什么?

通过将其与 RX 或 FRP 进行比较,是否有可能/容易理解 Continuation Monad 是什么?

最佳答案

我不熟悉 RX,但关于 FRP 和 continuation monad,它们是根本不同的概念。

Functional reactive programming是处理与时间相关的值和事件的问题的解决方案。使用事件,您可以通过对计算进行排序来解决回调问题,即当一个事件完成时,发送一个事件并触发下一个事件。但是对于回调,您真的不关心时间,您只想以特定方式对计算进行排序,因此除非您的整个程序基于 FRP,否则它不是最佳解决方案。

continuation monad根本与时间无关。这是一个抽象的计算概念,可以(粗略地说)获取当前评估序列的“快照”,并使用它们任意“跳转”到这些快照。这允许创建复杂的控制结构,例如循环和 coroutines .现在看看延续单子(monad)的定义:

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 中然后使用单子(monad)绑定(bind)操作对它们进行排序 >>= :
import Control.Monad.Cont

comp' :: String
comp' = runCont (cont f1 >>= cont . f2 >>= cont . f3) id

所以延续是回调问题的直接解决方案。

关于haskell - Continuation Monad 为什么以及如何解决回调 hell ?换句话说: Is RX or FRP = Continuation Monad ? IF not =,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791168/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com