首先声明一下,由于我对 Haskell 的了解不够深入,我可能完全误解了threepenny-gui 的工作方式,所以请对我的断言持保留态度。:-)
在我看来,一些组合器并不纯粹,例如
stepper :: MonadIO m => a -> Event a -> m (Behavior a)
步进器是否必须在某种类型的 IO monad 上运行(因此它不是纯的),或者我在这里误解了一些东西?第二个问题,如果这些组合子确实不纯,那是为什么?对我来说,这使得构建事件图的代码不如响应式香蕉那么好,因为必须使用 IO monad 而不是纯粹的普通函数。代码似乎变得比反应香蕉更复杂。
更可怕的是,valueChange 从类型上看似乎是纯的
valueChange :: Element -> Event String
但它实际上是在内部使用 unsafeMapIO ,所以它实际上是在做隐藏的 IO 吗?再说一次,我可能会误解一些东西,但这不是 Haskell 中最高的罪过吗?这也令人困惑,我无法从类型中看出回调注册是如何发生的……这在我之前在 Haskell 中从未发生过……这样做是为了让用户不必处理 Frameworks monad 吗?