为了试用Netwire,我正在使用该库实现Pong。在代码中我有一个球线和一个计算机桨线,由于它们相互依赖某些值,我遇到了无限循环的问题。一些伪代码解释:
ball :: Wire () IO GameInput Ball
ball = (... define ball ...) . pcPaddle
pcPaddle :: Wire () IO GameInput Paddle
pcPaddle = (... define pcPaddle ...) . ball
需要注意的是他们互相接受投入。我试图通过以下方式来缓解这种情况:
ball :: Wire () IO GameInput Ball
ball = ( ... ) . delay ( ... base paddle init ...) . pcPaddle
以及在这两条线路中使用delay
功能的其他变体,但我无论如何都得到<<loop>>
运行时错误。
如何初始化其中一根电线,以便该系统可以正常工作?
答案 0 :(得分:6)
当然,5分钟后,我发现似乎有效的神奇组合。我所做的是改变了电线输入的输入
ball :: Wire () IO Paddle Ball
ball = ...
paddle :: Wire () IO Ball Paddle
paddle = ...
然后,在创建我的电线网络时,我做到了这一点:
{-# LANGUAGE DoRec #-}
{-# LANGUAGE Arrows #-}
system = proc g -> do
rec b <- delay (... ball initial value ...) . ball -< p
p <- paddle -< b
returnA -< (b,p)
这会确认他们的依赖关系,并在第一次传球时给球拍出球的虚拟初始值。