【发布时间】:2016-01-12 16:23:15
【问题描述】:
由于钠已被作者deprecated ,我试图将我的代码移植到反应香蕉。但是,两者之间似乎存在一些我很难克服的不一致之处。
例如,在钠中,很容易检索行为的当前值:
retrieve :: Behaviour a -> IO a
retrieve b = sync $ sample b
我没有看到如何在反应香蕉中做到这一点
(我想要这个的原因是因为我试图将行为导出为 dbus 属性。可以从其他 dbus 客户端查询属性)
编辑:替换了“民意调查”这个词,因为它具有误导性
【问题讨论】:
-
在概念层面上,采样
Behavior仅在Moment的上下文中才有意义,即在特定的时间点,IO不提供。这不仅仅是一个理论问题,而且对于实现的内部一致性很重要,所以我在犹豫是否要添加这样的功能。您能否详细说明您想在其中使用它(dbus)的具体上下文?很有可能它可以用不同的方式表达。 -
事实证明,我可以使用 reactive-banana 提供的工具重新实现相同的行为:gist。我在这个例子中使用 unsafePerformIO 来尽可能接近钠的语义,但这绝不是必要的(我只需要传递 IO 操作)。所以问题就变成了:有没有理由不使用重复的“执行”而不是直接编译来构建网络?
-
@Philonous 您能否更精确地添加显示 dbus 和您的代码之间交互的代码?我认为阅读行为很有可能与事件打包在一起。
-
@Philonous 对于第二个问题:你能在 Github 上为此提出问题吗?我确实看到了在网络建成后运行 MomentIO 的必要性。请注意,如果允许多个网络,那么从
sync返回一个行为是有问题的,因为您可以尝试在另一个网络中使用它,这将非常失败。
标签: haskell io frp reactive-banana sodiumfrp