问题标签 [netwire]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 在 NetWire 5 中使用 `periodic`
考虑以下代码:
可以想象,testWire
它将尽可能快地运行电线并将输出打印到屏幕上。但是,如果我想每 2 秒运行一次电线怎么办?查看文档,periodic
可能是解决方案:
这几乎可以工作。输出似乎是静态的大约 2 秒,但是当它更新时,很明显,当输出停止时,电线正在运行。也许我应该反过来做?
但是,最终结果与我的第一次尝试完全一样。我在这里想念什么?
编辑:请参阅此答案以获取已接受答案的(劣质)替代方案。
haskell - Haskell Netwire:电线的电线
我正在尝试使用 netwire 包尝试了解 FRP,我有一个简单的问题。
从以下简单的电线开始,我能够每 5 秒(大约)发出一个事件
这是非常好的和直截了当的,但我接下来要做的是将产生的每个事件映射到一个线路,然后我可以观看更新。我有一个累加器功能,如下所示:
eventList
然后,我引入了一条新线,它将在开始触发事件之前进行抑制,如下所示:
所以我已经从事件转到包含电线列表的电线。最后,我引入了一条线来对这些线中的每一个进行步进并生成一个结果列表:
最后,我有我的主要程序来测试它:
我期望看到的是一个不断增长的列表,其中列表中的每个元素将显示它的创建时间 10 秒,之后元素将显示为零。相反,我得到的是不断增长的静态值列表。例如,我期望在几个步骤后看到的是
等等。我实际看到的是
所以我知道我的累加器功能正在工作:创建的每个事件都被转换成一条线。但我没有看到这些电线随着时间的推移发出不同的值。我的声明for 10 . pure x --> pure 0
应该在时间过去后将它们切换为发射 0。
我还是 FRP 的新手,所以我可能从根本上误解了它的一些重要内容(可能是这种情况。)
collision - Netwire 5 - 盒子不能弹跳
我正在尝试使用 OpenGL 将挑战 3(https://ocharles.org.uk/blog/posts/2013-08-01-getting-started-with-netwire-and-sdl.html)从 netwire 4.0 转换为 netwire 5.0 . 不幸的是,盒子不能弹跳。整个代码如下。在我看来,功能速度不起作用。当盒子与墙壁碰撞时,它不会反弹而是停止。如何更正我的程序?提前致谢。
haskell - 什么是用 Haskell 编写的游戏的最小示例?
三个月后更新
我在下面使用netwire-5.0.1
+有一个答案sdl
,在使用箭头和 Kleisli 箭头进行 I/O 的功能反应式编程结构中。虽然过于简单而不能称为“游戏”,但它应该是非常可组合和非常可扩展的。
原来的
我只是在学习 Haskell,并试图用它制作一个小游戏。但是,我想看看小型(规范)文本游戏可以是什么结构。我也尽量保持代码的纯净。我现在正在努力了解如何实施:
- 主循环。这里有一个例子How do I write a game loop in Haskell? 但似乎接受的答案不是尾递归的。我不确定这是否重要。据我了解,内存使用量会增长,对吧?
- 状态转换。不过,我认为这与第一个非常相关。我尝试了一些使用
State
,以及http://www.gamedev.net/page/resources/_/technical/game-programming/haskell-game-object-design-or-how-functions-can-get-you -apples-r3204,但是尽管单个组件可能会以有限的步骤工作和更新,但我看不出它如何在无限循环中使用。
如果可能的话,我想看一个基本的例子:
- 要求玩家输入一些东西,重复
- 当满足某些条件时,改变状态
- 当满足其他条件时,退出
- 理论上可以无限运行而不会炸内存
我没有任何可发布的代码,因为我无法获得非常基本的东西。我在网上找到的任何其他材料/示例都使用其他一些库,例如SDL
或GTK
驱动事件。我发现的唯一一个完全用 Haskell 编写的是http://jpmoresmau.blogspot.com/2006/11/my-first-haskell-adventure-game.html,但那个看起来不像主循环中的尾递归太(同样,我不知道这是否重要)。
或者,可能 Haskell 不打算做这样的事情?或者我应该把它main
放在 C 中?
编辑 1
所以我在https://wiki.haskell.org/Simple_StateT_use中修改了一个小例子,让它变得更简单(而且它不符合我的标准):
但是,它最终会溢出内存。我用
并且内存使用量开始线性增长。
编辑 2
好的,我找到了Haskell 递归和内存使用,并对“堆栈”有了一些了解......那么我的测试方法有什么问题吗?
haskell - Netwire 中的控制台交互性?
我正在使用 haskell 库进行测试,并使用简单的电线Netwire
使其工作:time
注意:run
基本上是从 修改的testWire
,所以我不知道它是否是形成电线网络的正确方法。部分代码来自http://todayincode.tumblr.com/post/96914679355/almost-a-netwire-5-tutorial但该教程并未提及事件。
现在我正在尝试为程序添加一些交互性。现在,当按下任意键时退出程序。我想我应该做一些事件切换。但是,我被困在这里,因为我找不到改变wire'
或切换行为的方法。我试图阅读 API 文档和源代码,但我看不到如何实际“触发”事件或使用它来切换线路。
同样,由于我对 Haskell 还不是很熟悉,我可能在这里犯了一些愚蠢的错误。
更新 1/2
我通过以下代码实现了我的目标。计时器在任何按键时停止。更新 2我设法分离出pollInput
另一个IO
唯一的功能,耶!
然而,这引发了一些进一步的问题。首先,这是好的做法吗?第二,什么是类型pollInput
?我试图手动输入它但没有成功。但是,自动类型推断有效。
这是我对这段代码如何工作的解释:
首先,轮询来自控制台的用户输入,经过一些逻辑后,生成到线的“输入”(名称选择不佳,但生成的输入是线输入)并沿网络传递。在这里,我简单地传递了一个抑制(Left something
),并导致循环退出。当然,退出时,程序会生成一个换行符以使控制台看起来更好。
(好吧,我仍然不明白它是如何Event
工作的)
更新 3/4
在阅读了@Cirdec 的答案并在我的编辑器上摆弄了很多之后,我得到了这个没有 的单线程版本IORef
,也退出了按 'x' Update 4:(但它不输出任何东西):
我认为这比我原来的要好得多,但我仍然不完全相信它是否是好的做法。
haskell - Netwire 5中的Kleisli Arrow?
我正在尝试使用 Haskell + Netwire 5 (+ SDL) 创建游戏。现在我正在处理输出部分,我想创建在某些游戏状态下读取的连线,并将 SDL 表面输出到屏幕上。
但是,问题在于 SDL 表面包含在IO
monad 中,因此创建此类表面的任何函数都必须具有 type a -> IO b
。当然,arr
不构造Wire
from a -> m b
。但是,由于线的类型签名是(Monad m, Monoid e) => Wire s e m a b
,它看起来很像 Kleisi 箭头,但我找不到合适的构造函数来制作这样的线。
我是 FRP 和 Arrows 的新手,并且没有在 Haskell 中进行过很多编程,所以这可能不是实现图形输出的最佳方式。如果我从一开始就错了,请告诉我。
一些 SDL 功能相关:
更新 1
此代码类型检查,但现在我正在尝试将其与 SDL 接口以进行测试
haskell - Haskell Netwire:正确完成的电线
我正在尝试“正确”地在 netwire 5 中实现一组动态电线。我已经阅读了电线问题的答案,并且我并不特别喜欢示例中的代码如何依赖于转换Event
为行为以在.stepWire
所以,我想通过Event
s 在动态集中添加和删除线,希望不利用Unsafe.Event
或等效的黑客。为简单起见,让我们删除删除部分,只需添加Wire
s 即可:
每个事件都会向隐藏在其中的(最初为空的)列表(或其他集合)添加一条新线,它们都会运行,都获得 type 的输入a
,并将它们的输出收集到一个列表中。
运行部分相对容易,带有可搜索的示例,例如:
上面的示例忽略了事件。我怀疑在转换函数中使用事件是不可能的,除了event
来自Unsafe.Event
. 那是对的吗?我想避免Unsafe.Event
。
当我退后一步查看使用事件的建议方法时,我看到了一个看起来很有前途的函数:
现在,如果我从简化的 runWires 开始:
并使 dynWireSet 成为 krSwitch:
我快到了!现在,如果我能fmap
完成(:)
并将runWires2
新电线插入newwires
,我就准备好了!但这在一般情况下是不可能的。事实上,只要我做对fmap
了,WGen
就fmaps
超过了输出。无用。
现在,这是我的想法。让我们介绍一个 的新变体data Wire
,我暂时称它为,WCarry g st
因为它将以不同的数据类型携带其内部状态。它的转换函数将是类型
并且,给定初始状态,构造函数将生成这样的 Wire:
仅将WCarry
类型而不是WGen
类型引入生成的电线。很容易runWires
根据mkCarry
.
然后, fmap 实例看起来像这样:
它将改变“隐藏在内部”的状态对象,我们将能够krSwitch
在这种Wire
s 上有意义地使用函数,在不丢失先前值的情况下调整它们的内部状态。
这有意义吗?如果我想要做的事情以更简单的方式成为可能,请指教!如果我说的有道理,我该怎么做呢?是否可以使用 WCarry 本地扩展data Wire
定义,并扩展添加具有相应定义的有趣类实例?还有什么建议吗?
谢谢。
haskell - 在网线中切换
我一直在寻找一段时间,我认为我误解了关于切换的一些基本内容。考虑以下代码
请注意,我在这里更加冗长只是为了了解所涉及的某些类型。我期望输出的是数字 10 重复 10 秒,然后我期望mainwire
切换到从返回的事件mything
(因为事件从mything
延迟 10 秒。)我看到的是主线抑制 10 秒,然后是 20。为什么我在切换之前没有看到最初输出 10?我想我误解了切换应该如何工作,任何澄清将不胜感激。谢谢你。
haskell - 如何实现与 Netwire 的冲突 (5.0.1)
我正在尝试使用 Netwire 对移动对象进行建模,并且想知道推荐的方法来实现诸如从墙上弹回球的方法。我遇到了几种可能的方法来做到这一点,我需要一些帮助才能真正让它们工作。
运动代码如下所示:
制作在特定位置反弹的速度箭头的推荐方法是什么,例如 x=20?
我已经看到了三种不同的方法可以做到这一点:
看起来最简单的 netwire
/li>-->
函数。我有一个使用这个函数的原型,但是我不知道如何根据碰撞时的速度制作一个新的速度箭头,我只能使用一个固定的值,如果对象可以加速,这个值就没有用了。在 Netwire 中使用
Event
and 。switch
我不明白如何使用这个。使用
(|||)
一般箭头可用的功能。
前两个似乎是最好的选择,但我不知道如何实现它们。
我已经看到了其他类似的问题,但是不同版本的 netwire 之间的不兼容使答案对我没有用处。
haskell - 是否有相当于步进器的网线?
Reactive-banana 有一个名为stepper
(of type MonadMoment m => a -> Event a -> m (Behavior a)
) 的函数,它将事件转换为行为,其中行为的值是最后一个事件的值,或者如果还没有事件发生,则为初始值。
在我记不起名字的 Conal Elliott 的一次演讲中,他将其描述为对事件和行为的基本操作之一。但是,我在 netwire 中找不到类似的功能。由于我对 netwire 的了解有限,我希望它具有以下类型:
a -> Wire s e m (Event a) a
- netwire 有等效的功能吗?
- 如果不是,有什么理由不能做到这一点?
- 是否有任何类似的可能,即将事件转化为行为的方式?