Haskell netwire的完整示例?
我读过netwire,但我很难想象在一个“真实”的应用程序中整个事情会是什么样子。由于本教程只涉及纯电线,我特别感兴趣的游戏,如果有任何,但我不会介意其他。反应型香蕉的例子可能也可以。它们应该只是说明FRP是如何有用的。Netwire在一些实际应用中使用,但我不知道在哪里可以找到它们。很可能他们现在关起门来了。然而,Reddit上已经发布了一些示例应用程序的博客,所以您可能想查看一下。只要在那里搜索“netwire”。不幸的是,这些示例没有帮助,因为这两个库(特别是用于事件处理的库)的概念完全不同 Netwire应用程序的总体结构如下:首先定义一个反应值,我们称之为Haskell netwire的完整示例?,haskell,Haskell,我读过netwire,但我很难想象在一个“真实”的应用程序中整个事情会是什么样子。由于本教程只涉及纯电线,我特别感兴趣的游戏,如果有任何,但我不会介意其他。反应型香蕉的例子可能也可以。它们应该只是说明FRP是如何有用的。Netwire在一些实际应用中使用,但我不知道在哪里可以找到它们。很可能他们现在关起门来了。然而,Reddit上已经发布了一些示例应用程序的博客,所以您可能想查看一下。只要在那里搜索“netwire”。不幸的是,这些示例没有帮助,因为这两个库(特别是用于事件处理的库)的概念完全不
模拟
。在最简单的情况下,它是一根纯电线:
simulation :: WireP a [Particle]
在不详细说明(目前)如何编写该电线的情况下,让我现在解释一下它是什么。输出类型为[Particle]
,因此它是粒子的反应列表。这意味着,这个列表可以随着时间的推移而改变。值得注意的是,输入类型是完全多态的,因此您知道此被动值不依赖于其他被动值
现在,您需要获取特定时间点上粒子列表的实际值。这就是会话和步进函数的作用。在这种情况下,大多数应用程序只需要一个会话步进函数,如stepSessionP
。您只需在循环中调用此函数,即可获得此时导线的当前值。不需要连续调用此函数
您会注意到,步进函数不会给您一个[Particle]
,而是一个或LastException[Particle]
。这是因为Netwire中的反应值可以抑制。这就是事件概念。你从分类法中知道
w . id
与w
相同,大致相同x+0
与x
相同。相对于()
,标识线为中性线。然而,现在想象一下
w . myId
其中myId
的作用类似于标识线,只产生它所依赖的任何反应值,但有时根本不会产生。有时它忽略了值,只是抑制,在这种情况下,合成本身抑制。您可以将myId
解释为一个事件连线,并在myId
的情况下将合成内容解读为“w
”:
然后是选择运算符()
,其作用类似于事件的“或”:
w1 . ev1 <|> w2 . ev2 <|> w3
w1。ev1 w2。ev2 w3
如果
ev1
禁用,则尝试其余操作。理想情况下,主线从不禁止,因此您可以使用stepSessionP\uuu
,但它由潜在的禁止线组成。您也可以使用自己的抑制幺半群来获得退出信号。对于将来偶然发现这一点的人,我认为这是使用netwire的完整应用程序的一个很好的例子。他也开始(从今天起)研究吃豆人
这是对netwire的一个不错的介绍,但它并不能真正帮助我理解在应用程序中会是什么样子。@Cubic:本教程介绍了这一点。它为您提供了一个简单的应用程序,您可以进行实验。如果您对该示例有任何问题,请在此处给出更详细的问题描述。我理解该示例,但它所做的只是定义一条纯导线并逐步执行。虽然这很有趣,但实际上并没有说明如何在实际应用中使用导线。我知道玻璃钢没有应用,但我希望至少有一种。@Cubic:好吧,理想的情况是,在实际应用中,你的金属丝也是纯的。然而,“纯”并不意味着“非一元”。在您的wire下面有一个读卡器monad,如
WireM((->)AppState)
而不是WireP
,这是很常见的。例如,在SDL模拟中,您可以将当前GUI事件作为AppState
,并且导线可以生成类似于Gloss中的picture
或vty中的Image
编码的图片。主循环将负责构造AppState
并显示输出图像。我不知道通常是monad的m参数会做什么-除了修复stepWire的类型。请看以下内容:。代码不是我的,需要Windows和以下软件包:ansi终端、composition、netwire。这太棒了,正是我想要的。
w1 . ev1 <|> w2 . ev2 <|> w3