Поведение, которое одновременно рекурсивно и зависит от других поведений

Моя сеть выглядит так:

ePhysics :: Event t ()
bPlayerForce :: Behavior t (Double,Double)
bPlayerPosition :: Behavior t (Double, Double)

ePhysics постоянно запускается по таймеру.
У меня возникли проблемы с определением bPlayerPosition. Я имею в виду, что он начнется с (0,0), и всякий раз, когда запускается ePhysics, bPlayerPosition будет пересчитываться с использованием bPlayerForce в качестве параметра.

Проблема в том, что для указания начального значения мне нужно использовать accumB/stepper, но они работают только с событиями, и я не могу получить значение силы из bPlayerForce, так как только поведения могут получить значение других поведений (с <*> ).

Альтернативой было бы просто использование <*>, но при этом у меня нет начального значения, поэтому это становится бессмысленной бесконечной рекурсией:

let bPlayerPosition = pure calcPosition <*> bPlayerForce <*> bPlayerPosition

У меня есть 3 вопроса:

  1. Есть ли способ получить ценность поведения без <*>? например, когда reactimateинг или отображение события? проблема неспособности не дает мне покоя с самого начала.
  2. Будет ли более функциональный/frp способ заниматься физикой? (в целом и те, которые относятся к вопросу)
  3. Как я могу решить представленную проблему?

person MasterMastic    schedule 11.08.2014    source источник
comment
Похоже, вам просто нужно apply, он же (<@>)   -  person luqui    schedule 12.08.2014
comment
Очень FRP-способ делать физику включает integral :: (VectorSpace v) => Behavior v -> Behavior v, который не предоставляет реактивный банан, но который может быть аппроксимирован (по сути, так, как вы описываете здесь, но значение важно!).   -  person luqui    schedule 12.08.2014
comment
@luqui Не могли бы вы уточнить apply? Я имею в виду, что у меня нет никакого события, относящегося к его аргументу. Если реактивный банан не на 100% идеально подходит для этой задачи, не могли бы вы предложить библиотеку FRP, которая была бы более полной для меня (и, надеюсь, с integral, о котором вы упомянули)?   -  person MasterMastic    schedule 12.08.2014


Ответы (1)


  1. Комбинатор apply, также называемый <@>, и его вариант <@ предоставляют способ выборки поведения всякий раз, когда происходит событие.
  2. Выглядит хорошо для меня. Пример Animation.hs делает нечто подобное. Вы должны аппроксимировать интеграл, суммируя дискретные временные шаги, которые задаются вашим ePhysics событием.
  3. Что-то в духе

    let bPlayerPosition = stepper (0,0) $
            (calcPosition <*> bPlayerForce <*> bPlayerPosition) <@ ePhysics
    
person Heinrich Apfelmus    schedule 12.08.2014