行为既是递归的,又取决于其他行为

Mas*_*tic 6 recursion haskell frp reactive-programming reactive-banana

我的网络看起来像这样:

ePhysics :: Event t ()
bPlayerForce :: Behavior t (Double,Double)
bPlayerPosition :: Behavior t (Double, Double)
Run Code Online (Sandbox Code Playgroud)

ePhysics从计时器反复触发.
我在定义方面遇到了问题bPlayerPosition.我打算将它作为一个参数重新计算,它将在(0,0)什么时候ePhysics被触发.bPlayerPositionbPlayerForce

问题是,按顺序来指定一个初始值,我需要使用accumB/ stepper,但他们只使用这些事件,我不能得到力值bPlayerForce,因为只有行为可以得到其他行为(具有的价值<*>).

替代方案只是使用<*>但是我没有初始值,所以它变成了无意义的无限递归:

let bPlayerPosition = pure calcPosition <*> bPlayerForce <*> bPlayerPosition
Run Code Online (Sandbox Code Playgroud)

我有3个问题:

  1. 有没有办法从行为中获取价值<*>?喜欢,在进行reactimate或映射事件时?从一开始就不能一直与我联系的问题.
  2. 是否有更多功能/ frp方式来做物理?(一般而言,问题的具体内容)
  3. 如何解决出现的问题?

Hei*_*mus 5

  1. apply组合子,也叫<@>,它的变异<@提供了一种方法,每当事件发生采样行为.
  2. 看起来很好.该Animation.hs例子做类似的事情.您必须通过对ePhysics事件给出的离散时间步长求和来近似积分.
  3. 有点像

    let bPlayerPosition = stepper (0,0) $
            (calcPosition <*> bPlayerForce <*> bPlayerPosition) <@ ePhysics
    
    Run Code Online (Sandbox Code Playgroud)