Существует более чем один способ сделать 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)
Это в основном о государственной монаде. Функциональное реактивное программирование часто включает в себя монады, но обычно это простая форма государственной монады. – RD1
Как я уже сказал, у меня нет опыта в FRP. Тем не менее государственная монада (или монады вообще), по-видимому, представляет собой концепцию, которая была запрошена - удобно хранить и изменять контекстные данные без потери ссылочной прозрачности. Если FTP уже использует монадическую инфраструктуру, тем лучше. Государственный трансформатор монады должен сделать это (вы имеете в виду это с * простым видом *?). Но, не объяснив основы, эта информация была бы бесполезной! – Dario
Основная точка FRP позволяет определять поведение как непрерывные функции времени - например, вы можете определить z-положение шара под действием силы тяжести при z (t) = 9,8 * t * t. Монадическое состояние имеет значение только для состояния, которое производит дискретные изменения - дискретные изменения также допускаются в FRP, но они менее центральны и часто не соответствуют точной форме монады. – RD1