我读过netwire的quickstart,但我很难想象整个东西在一个“真正的”应用程序中会是什么样子。由于本教程只涉及纯网络,因此我对游戏特别感兴趣,但我不介意其他游戏。响应式的Banana示例可能也会这样做。他们应该只是说明FRP是如何有用的。
发布于 2013-09-05 04:06:04
对于那些在将来偶然发现这一点的人,我认为这是一个使用netwire的完整应用程序的很好的例子。他也开始(从今天开始)开发PACMAN。
http://www.reddit.com/r/haskell/comments/1kmes7/building_an_asteroids_clone_in_haskell_using/
http://ocharles.org.uk/blog/posts/2013-08-18-asteroids-in-netwire.html
发布于 2013-02-09 22:55:25
Netwire在一些真实的应用程序中使用,但我不知道在哪里可以找到它们。很可能他们现在是关起门来的。然而,一些示例应用程序已经在Reddit上发布了博客,所以你可能想看看/r/haskell。在那里搜索"netwire“就可以了。不幸的是,反应式香蕉示例不会有帮助,因为这两个库的概念是完全不同的,特别是对于事件处理。
Netwire应用程序的整体结构是这样的:首先定义一个反应值,让我们将其称为simulation。在最简单的情况下,它是一条纯电线:
simulation :: WireP a [Particle]在不详细说明如何编写该连接的情况下,现在让我来解释一下它是什么。输出类型为[Particle],因此它是粒子的反应式列表。这意味着,这个列表可能会随着时间的推移而变化。值得注意的是,输入类型是完全多态的,因此您知道此反应值不依赖于其他反应值。
现在,您希望获取粒子列表在特定时间点的实际值。这就是会话和单步执行函数的用武之地。大多数应用程序只需要一个会话单步执行函数,比如本例中的stepSessionP。您只需在循环中调用此函数,即可获得该时刻的导线的当前值。不需要连续调用此函数。
您将注意到,单步执行函数没有给出[Particle],而是给出了一个Either LastException [Particle]。这是因为Netwire中的电抗值可能会抑制。这就是事件的概念。你从分类法则中知道,
w . id与w相同,就像x + 0与x一样。标识线相对于(.)是中立的。然而,现在想象一下
w . myId其中myId的作用就像同一线,只会产生它所依赖的任何反应值,但有时根本不会产生结果。有时它会忽略这个值,只是禁止,在这种情况下,组合本身就会禁止。您可以将myId解释为事件连接,并将组合读作"w if myId":
w . keyDown Space然后您有您的选择操作符(<|>),它的作用类似于事件的"or“:
w1 . ev1 <|> w2 . ev2 <|> w3如果ev1禁止,则会尝试其余的操作。理想情况下,主线永远不会禁止,因此您可以改用stepSessionP_,但它由潜在的禁止线组成。您也可以使用自己的抑制monoid来获得诸如退出信号之类的东西。
https://stackoverflow.com/questions/14787797
复制相似问题