Netwire 用于一些实际应用程序,但我不知道在哪里可以找到它们。他们目前可能处于闭门状态。不过,Reddit 上已经发布了一些示例应用程序的博客,因此您可能需要查看一下/r/哈斯克尔 http://www.reddit.com/r/haskell/。只需在那里搜索“netwire”即可。不幸的是,reactive-banana 示例没有帮助,因为这两个库的概念,特别是事件处理的概念完全不同。
Netwire 应用程序的整体结构是这样的:首先定义一个无功值,我们称之为simulation
。在最简单的情况下,它是一根纯线:
simulation :: WireP a [Particle]
在不详细说明如何编写该线路的情况下,现在让我解释一下它是什么。输出类型是[Particle]
,所以它是粒子的反应列表。这意味着,这个列表可能会随着时间的推移而改变。值得注意的是,输入类型是完全多态的,因此您知道该无功值不依赖于其他无功值。
现在您想要获取特定时间点的粒子列表的实际值。这就是会话和步进函数发挥作用的地方。大多数应用程序只需要会话步进函数之一,例如stepSessionP
在这种情况下。您只需在循环中调用此函数即可获取此时电线的当前值。无需连续调用该函数。
您会注意到步进功能不会给您[Particle]
, but a Either LastException [Particle]
。这是因为 Netwire 中的无功值可以inhibit。这就是事件的概念。从范畴法则你知道
w . id
与刚才相同w
大致以同样的方式x + 0
是相同的x
。身份线是中性的(.)
。然而,现在想象一下
w . myId
where myId
其作用类似于身份线,只会产生它所依赖的任何无功值,但有时根本不会产生任何结果。有时它会忽略该值而只是抑制,在这种情况下,组合物本身会抑制。你可以解读myId
作为事件线并将组合物读取为“w
if myId
":
w . keyDown Space
然后你就有了选择运算符(<|>)
,其作用类似于事件的“或”:
w1 . ev1 <|> w2 . ev2 <|> w3
If ev1
抑制,其余的都尝试。理想情况下,主线永远不会抑制,所以你可以使用stepSessionP_
相反,它是由潜在的抑制线组成的。您还可以使用自己的抑制幺半群来获得诸如退出信号之类的东西。