【问题标题】:Is the signal system of Elm available as a Haskell library?Elm 的信号系统可以作为 Haskell 库使用吗?
【发布时间】:2015-03-20 10:28:59
【问题描述】:

对于我正在处理的任务,Elm 编程语言的信号系统似乎是一个合适的解决方案。

但是我的纯计算函数是在 Haskell 中实现的。是否有一个 Haskell 库可以让我构建一个信号图(在节点中使用我的纯函数),以便它像在 Elm 中一样工作?

我的背景

我需要按需观察大量计算的中间结果,即我不想实际格式化和输出每个中间结果,但如果需要,我应该以最新的中间结果响应(从计算信号中接收到)。

其实有几个并行计算,其中一些使用其他的结果,所以我想要几个独立的输出信号来观察它们。所以我相信我可以编写一个 Elm 程序来对系统进行建模,以观察可用的中间结果。 (也许,我错了,我应该尝试至少在 Elm 中编写一个原型,但我也在考虑与我的主要 Haskell 代码集成。)

【问题讨论】:

  • 有许多 Haskell FRP 包。我认为在尝试从 Elm 移植某些内容之前,您可能应该深入研究这些内容。
  • 在新Auto library 的讨论中提到了该领域的一些内容。现在我怀疑我需要更像真实(“实时”)FRP 的东西,而不是像 Elm 或 Auto 这样的伪 FRP,因为我希望依赖节点仅在实际空闲时执行新计算-时间(完成之前的工作),它应该从源节点获取任何可用的中间结果,跳过之前的任何结果,而不是等待新的结果......
  • 在低级别上,我认为这是一个可变变量,保存最后计算的中间结果(在源节点中),并且依赖节点在它再次空闲时读取它。或者更好:每当它被查询时,因此必须强制计算它的值。好吧,最后一部分与 Elm 系统并没有那么不同,但是我还不清楚源信号在 Elm 系统中就像一个可变变量的想法。无论如何,我的这些考虑与我在本文标题中提出的问题没有直接关系。
  • 无论如何,我的这些考虑与我在本文标题中提出的问题没有直接关系。我相信标题中的问题对于 Haskell 社区来说是一个非常重要且有趣的问题,因为 Elm 有一个有吸引力的、展示良好且广为人知的信号系统,许多人可能希望在他们的 Haskell 程序中使用它。跨度>
  • 我的特定问题的一个很好的解决方案可能是将我的计算节点写为coroutines(另见Bargain Priced Coroutines),然后是一个专门的顶级主函数,它将通过可变变量并使用真实线程“实时”调度它们。然后我可以灵活地将它们嵌入到一个完全不同的调度程序中(纯粹是功能性的,具有离散的步骤,协作多任务,或者不那么细粒度)

标签: haskell frp elm


【解决方案1】:

Helm,我目前是它的维护者,可能就是您正在寻找的东西。它确实将信令与始终出现的 SDL 窗口结合在一起。您可以hack the render function 并在没有 SDL 的情况下仍然使用 Helm 的 Signal,或者您可以从 Helm 中汲取灵感并使用 Elerea(Helm 在后台使用它)编写类似的 Signal 类型。

一个更好的主意可能是修改 Helm 以允许 main 可能没有任何内容可显示并向我们发送拉取请求的用例。

【讨论】:

    【解决方案2】:

    来自a comment by Tekmo 关于“Elm 0.15:任务、邮箱和导入”的公告 语法”:

    邮箱的 Haskell 版本是pipes-concurrency。模拟 Elm 的 AddressOutputSignal 的类似物是 Input.

    (顺便说一句,这似乎与我所寻找的非常接近。最初,在 以前版本的 Elm,我真正想要的抽象似乎 已丢失,但 tasksmailboxes 可能适合我的需要 很好。所以,现在我知道——感谢 Tekmo 的评论—— 类似的 Haskell 库是 pipes-concurrency。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2016-09-08
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多