Estoy trabajando en un programa que usa reactive-banana, y me pregunto cómo estructurar mis tipos con los bloques básicos de FRP.Dónde aplicar Comportamiento (y otros tipos) en FRP
Por ejemplo, aquí hay un ejemplo simplificado de mi programa real: decir que mi sistema se compone principalmente de widgets - en mi programa, fragmentos de texto que varían con el tiempo.
pudiera tener
newtype Widget = Widget { widgetText :: Behavior String }
pero también podría tener
newtype Widget = Widget { widgetText :: String }
y utilizar Behavior Widget
cuando quiero hablar sobre el comportamiento variable en el tiempo. Esto parece hacer las cosas "más simples", y significa que puedo usar las operaciones Behavior
más directamente, en lugar de tener que desempaquetar y volver a empaquetar los widgets para hacerlo.
Por otro lado, el primero parece evitar la duplicación en el código que realmente define widgets, ya que casi todos los widgets varían con el tiempo, y me encuentro definiendo incluso los pocos que no lo hacen con Behavior
, ya que me permite combinarlos con los demás de una manera más consistente.
Como otro ejemplo, con ambas representaciones, tiene sentido tener una instancia Monoid
(y quiero tener una en mi programa), pero la implementación de esta última parece más natural (ya que es simplemente una elevación trivial del lista monoid para el nuevo tipo).
(Mi programa real utiliza Discrete
en lugar de Behavior
, pero no creo que eso es relevante.)
Del mismo modo, debería utilizar Behavior (Coord,Coord)
o (Behavior Coord, Behavior Coord)
para representar un punto 2D? En este caso, el primero parece ser la elección obvia; pero cuando se trata de un registro de cinco elementos que representa algo así como una entidad en un juego, la elección parece menos clara.
En esencia, todos estos problemas pueden reducir a un:
Cuando se utiliza FRP, en qué capa debo aplicar el tipo Behavior
?
(La misma pregunta se aplica a Event
también, aunque en menor grado.)
Bueno, en el caso de 'Widget', tener solo un campo no era una simplificación, es mi situación real, así que no hay tuplas involucradas :) Gracias por la ayuda, sin embargo, debería ser muy útil en el futuro! Pondré el 'Comportamiento' dentro del nuevo tipo por ahora. Desearía poder aceptar ambas respuestas :) – ehird