【问题标题】:Are there monads that can be used like an automaton?有没有可以像自动机一样使用的单子?
【发布时间】:2011-12-07 17:09:50
【问题描述】:

我正在编写一个从某种输入数据类型到输出数据类型的流转换器。输入由用户进行,因此事件之间有一些时间。因为每个输入都需要一些资源加载,所以我想“展望未来”,即将所有可能的输入发送到主计算并根据结果预加载资源。

目前,每次输入之后总是只有一个输出,但最终可能会变得有趣。

我使用 Ross Paterson 的 Automaton 变压器成功地实现了这一点。我不确定我的解决方案是否最佳。

  • 有没有很好的示例如何做到这一点?甚至可以使用测试代码?
  • 也可以通过 monad 来实现吗? (例子?,解释为什么不可能?)

编辑: 在要求更多细节之后,我在这里添加了代码。现在我要删除它(这是无法理解的)并添加一些其他解释。我的问题得到了解答。

我的目的是让主事件循环在每个用户输入被馈送到箭头/流转换器/任何东西之后停止。然后它将存储当前的自动机状态并将所有可能的输入(假事件)一一发送给自动机,并查看必须加载哪些资源,以缓存它们。在下一个真实事件之后,它将使用缓存以获得更好的响应。主计算不应受此影响。

【问题讨论】:

  • 没有资格回答,但 iteratees 可能对您有用。请参阅此库:hackage.haskell.org/package/enumerator ... 但箭头似乎是一个很好的抽象。我敢打赌,更多细节会帮助人们回答。

标签: haskell monads arrows automaton


【解决方案1】:

您提到的所有用例都包含在Netwire 库中。它将罗斯的自动机箭头推广到 wire 箭头系列。我还没有完成wiki page,但它应该足够你开始了。

将它与 Kleisli (LogicT m) 结合使用某些 monad m 你会得到不确定的连线。

另外说明:你想要的不是 monad。

【讨论】:

  • 你好厄特斯!你能解释一下为什么这不是一个单子吗?
  • @Duschvorhang:箭头是单子的概括。见Haskell wiki > arrow
  • @Duschvorhang:您可以在 John Hughes 的Generalizing Monads to Arrows 的 §3.0 的解析器示例中看到类似的限制,并仔细解释了箭头如何提供所需的表现力。此外,这是一本不错的读物。
  • 我开始阅读休斯的论文。我非常喜欢基于箭头的解释器。我现在决定看看 reactive-banana 并尝试从它的概念中学习。
猜你喜欢
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多