Я пытаюсь понять, как работает это функциональное реактивное программирование, и столкнулся с проблемой. Я пытаюсь создать моделирование boid, но начинаю медленно, и мне на данный момент определили boid как функцию, принимающую начальную позицию и создающую сигнальную функцию из позиции в позицию, где вход — это точка, к которой он движется, а выход — текущая позиция:
type Position2 = Vector2 Float
boid :: Position2 -> SF Position2 Position2
boid s = loop (arr (uncurry seek) >>> integral >>> arr (^+^ s) >>> arr dup)
функция seek принимает два входа (из-за цикла). Текущая позиция и целевая позиция. Затем он просто создает вектор, указывающий от текущей позиции к целевой позиции с величиной 50, то есть со скоростью. Затем скорость интегрируется и добавляется начальное положение. В конце сигнал разделяется на две части, так что одна может стать выходом, а другая может вернуться в функцию поиска.
Теперь я могу определить boids следующим образом:
aBoid = constant (vector2 500 500) >>> (boid (vector2 600 60))
bBoid = aBoid >>> (boid (vector2 3 4))
Здесь aBoid ищет точку (500, 500), а bBoid ищет aBoid.
Моя проблема в том, что когда я хочу, чтобы два боида стремились друг к другу. Когда я делаю это:
aBoid = bBoid >>> (boid (vector2 600 60))
bBoid = aBoid >>> (boid (vector2 3 4))
Программа просто печатает: ProgramName: <<loop>>
, что, как я предполагаю, означает, что она входит в бесконечный цикл.
Я также пытался использовать функцию par
следующим образом:
sim :: SF a [Position2]
sim = loop (arr snd >>> par route [boid (vector2 10 10), boid (vector2 100 100)] >>> arr dup)
здесь функция route
просто сопоставляет вывод каждого боида со входом другого (как zip
, но со смещением 1)
Это также дает сообщение <<loop>>
.
Я думаю, что зависимость объектов от состояния друг друга должна быть довольно распространенной проблемой при работе с реактивными системами, поэтому я надеюсь, что есть какое-то элегантное решение.
Я должен добавить, что я нахожу эту штуку FRP очень сложной и часто запутанной, поэтому я не совсем уверен, что вообще имею смысл ;)