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

时间:2014-08-11 22:43:47

标签: haskell recursion reactive-programming frp reactive-banana

我的网络如下:

ePhysics :: Event t ()
bPlayerForce :: Behavior t (Double,Double)
bPlayerPosition :: Behavior t (Double, Double)
从计时器反复触发

ePhysics 我在定义bPlayerPosition方面遇到了问题。我打算从(0,0)开始,每当ePhysics被触发时,bPlayerPosition将使用bPlayerForce作为参数重新计算。

问题在于,为了指定我需要使用accumB / stepper的初始值,但它们只适用于事件,而我无法从{获取力值{1}}因为只有行为才能获得其他行为的价值(使用bPlayerForce)。

另一种方法是使用<*>但是我没有初始值,所以它变成了无意义的无限递归:

<*>

我有3个问题:

  1. 有没有办法从没有let bPlayerPosition = pure calcPosition <*> bPlayerForce <*> bPlayerPosition 的行为中获取价值?比如,<*>或映射事件?从一开始就不能一直与我联系的问题。
  2. 是否有更多功能/ frp方式来做物理? (一般而言,问题的具体内容)
  3. 如何解决所提出的问题?

1 个答案:

答案 0 :(得分:5)

  1. apply组合子(也称为<@>)及其变体<@提供了一种在事件发生时对行为进行抽样的方法。
  2. 对我来说很好看。 Animation.hs示例做了类似的事情。您必须通过对ePhysics事件给出的离散时间步长求和来近似积分。
  3. 的内容
    let bPlayerPosition = stepper (0,0) $
            (calcPosition <*> bPlayerForce <*> bPlayerPosition) <@ ePhysics