首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用netwire的周期vs.at线

使用netwire的周期vs.at线
EN

Stack Overflow用户
提问于 2014-05-17 17:30:12
回答 2查看 164关注 0票数 3

我试图在Haskell中为实时交互图形编写一个框架。我一直试图通过使用Netwire 5来处理一些事情,但是我似乎对事物之间的“依赖”没有很好的把握。例如,下面的代码应该在切换到(val + 1)之前产生两秒钟的val,然后无限期地继续。

代码语言:javascript
复制
someWire :: Num a => a -> Wire s e m a a
someWire x = (-->) ((pure x) &&& (periodic 2) >>> until) (someWire (x + 1))

然而,这会造成某种类型的内存泄漏,使我的程序停止运行,并一直分配内存直到系统崩溃。或者,这个定义

代码语言:javascript
复制
someWire :: Num a => a -> Wire s e m a a
someWire x = (-->) ((pure x) &&& (at 2) >>> until) (someWire (x + 1))

按照我预期的方式:从val开始计数,值每2秒更改一次。有人能解释一下这种行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-17 20:15:09

关键的见解是,periodic会立即生成一个事件。

因此,当我们从这条导线产生一个值时,我们必须将其计算为以下几个方面:

代码语言:javascript
复制
someWire x
(-->) ((pure x) &&& (periodic 2) >>> until) (someWire (x + 1))
(-->) (pure (x, Event _) >>> until) (someWire (x + 1))
(-->) *inhibition* (someWire (x + 1))
someWire (x + 1)

因为这不是尾递归,所以垃圾收集器不允许清理分配给线路的以前的实例,并且内存耗尽(而不是得到一个无限循环)。

票数 1
EN

Stack Overflow用户

发布于 2014-05-17 19:04:20

让我们看一下工作版本:

代码语言:javascript
复制
import Control.Wire hiding (until)
import qualified Control.Wire (until) as W

someWire :: Num a => a -> Wire s e m a a
someWire x = (-->) (pure x &&& at 2 >>> W.until) (someWire (x + 1))

-- To test in GHCi: testWire clockSession_ $ someWire 3 

Wires是Arrows,因此,如果我们能够跟踪箭头组合子所做的事情,就更容易理解正在发生的事情。

代码语言:javascript
复制
(&&&) :: Arrow a => a b c -> a b c' -> a b (c, c')

(&&&)构建了一个箭头,将它的输入(在我们的例子中,可以看作是驱动事件的心跳)构建成一对,将一个箭头应用到每个组件上。在这里,我们使用一个总是生成x的箭头和一个返回在两秒钟内将要发生的事件的箭头。

代码语言:javascript
复制
(>>>) :: Category cat => cat a b -> cat b c -> cat a c

(>>>)只是箭头的组合(ArrowCategory的一个子类),以第一到第二顺序写成。因此,我们将pure x &&& at 2的输出发送给W.until

代码语言:javascript
复制
W.until :: Monoid e => Wire s e m (a, Event b) a

使用W.until进行组合时,将生成与事件(如pure x &&& at 2)配对的值的箭头转换为生成值的箭头,直到事件发生为止。一旦发生这种情况,我们就使用(-->)切换到另一条线路。

现在应该更容易理解为什么不能使用periodic而不是atat发生在一个瞬间,而periodic一直在发生,因此W.until永远不会终止。(如果深入挖掘源代码,您会发现W.until做了一些类似于事件发生的折叠操作,这与直观的解释是一致的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23714212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档