Существует более одного способа сделать FRP, и это активная область исследований.То, что лучше всего, может во многом зависеть от деталей того, как вещи взаимодействуют друг с другом, и в будущем могут появиться новые и лучшие методы.
В общих чертах идея состоит в том, чтобы иметь поведение, которое является функцией времени, вместо обычных значений (как вы сказали).Поведения могут быть определены в терминах других поведений и могут быть определены для переключения между другими поведениями, когда происходят определенные события.
В вашем примере, как правило, вам не нужно запоминать положение мяча с помощью аргументов (но для некоторых видов FRP вы могли бы сделать).Вместо этого вы можете просто иметь поведение:
ballPos : time -> (float * float)
Это может иметь глобальную область действия, или для более крупной программы может быть лучше иметь локальную область действия со всеми ее использованием в этой области.
По мере того, как все усложняется, поведение будет определяться все более сложными способами, зависеть от других поведений и событий, включая рекурсивные зависимости, которые обрабатываются по-разному в разных средах FRP.В F # для рекурсивных зависимостей я бы ожидал, что вам понадобится let rec
, включая все вовлеченные поведения.Хотя они по-прежнему могут быть организованы в структуры - на верхнем уровне вы можете иметь:
type alienInfo = { pos : float*float; hp : float }
type playerInfo = { pos : float*float; bombs : int }
let rec aliens : time -> alienInfo array = // You might want laziness here.
let behaviours = [| for n in 1..numAliens ->
(alienPos player n, alienHP player n) |]
fun t -> [| for (posBeh, hpBeh) in behaviours ->
{pos=posBeh t; hp=hpBeh t} |] // You might want laziness here.
and player : time -> playerInfo = fun t ->
{ pos=playerPos aliens t; bombs=playerBombs aliens t}
И затем можно определить поведение для alienPos, alienHP, с зависимостями от игрока и playerPos, playerBombs могутбыть определенным с зависимостями от инопланетян.
В любом случае, если вы сможете дать больше подробностей о том, какой тип FRP вы используете, вам будет легче дать более конкретные советы.(А если вам нужен совет по какому типу - лично я бы порекомендовал прочитать: http://conal.net/papers/push-pull-frp/push-pull-frp.pdf)