gpt4 book ai didi

haskell - 为什么一些三便士-gui FRP 组合器在 MonadIO monad 上运行而不是纯粹的?

转载 作者:行者123 更新时间:2023-12-04 11:52:27 28 4
gpt4 key购买 nike

首先声明一下,由于我对 Haskell 的了解不够深入,我可能完全误解了threepenny-gui 的工作方式,所以请对我的断言持保留态度。 :-)

在我看来,一些组合器不是纯粹的,例如

stepper :: MonadIO m => a -> Event a -> m (Behavior a)

步进器是否必须在某种类型的 IO monad 上运行(因此它不是纯的),或者我在这里误解了一些东西?第二个问题,如果这些组合子确实不纯,那是为什么?对我来说,这使得构建事件图的代码不如响应式香蕉好,因为必须使用 IO monad 而不是纯粹的普通函数。代码似乎变得比 react 香蕉更复杂。

更可怕的是,valueChange 从类型上看似乎是纯的
valueChange :: Element -> Event String

但它实际上是在内部使用 unsafeMapIO ,所以它实际上是在做隐藏的 IO 吗?再说一次,我可能会误解一些东西,但这不是 Haskell 中最高的罪过吗?这也令人困惑,我无法从类型中看出回调注册是如何发生的……这在我之前在 Haskell 中从未发生过……这样做是为了让用户不必处理 Frameworks monad 吗?

最佳答案

我不是三便士 gui 用户,但我可以通过阅读代码为您提供一些关于您的问题的信息。

首先关于stepper : threpenny-gui 内部似乎使用 IORefs 来跟踪累积参数。这就是为什么stepper需要 MonadIO .但是,我认为这不需要 IO要构建您的事件图,它只意味着它必须在 IO 中运行.作为 API 用户,这不会给您带来任何尴尬。如果您认为确实如此,请发布更具体的问题。

其次关于valueChange以不安全函数的形式实现:是的,这在 Haskell 库中很常见。当 Haskell 库的作者知道它们的使用方式对于所有可能的执行路径实际上是安全的时,他们经常使用不安全的函数,但不可能向类型系统证明这一点。换句话说,库作者以安全的方式使用不安全的操作,因此您不必这样做!

关于haskell - 为什么一些三便士-gui FRP 组合器在 MonadIO monad 上运行而不是纯粹的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23044464/

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