20

Cuando juego con la implementación de FRP, una cosa que he encontrado que es confusa es qué hacer con con el pasado? Básicamente, mi entendimiento era que iba a ser capaz de hacer esto con un comportamiento en cualquier punto:¿Nos importa el 'pasado' en FRP?

beh.at(x) // where time x < now 

Esto parece que podría ser el rendimiento problemática sabia en un caso como este:

val beh = Stepper(0, event) // stepwise behaviour 

Aquí podemos ver que para evaluar el comportamiento en el pasado necesitamos mantener todos los eventos y terminaremos realizando (en el peor) escaneos lineales cada vez que muestreemos.

¿Deseamos que esta capacidad esté disponible o solo se debe permitir que los comportamientos se evalúen a la vez> = ahora? ¿Queremos incluso exponer la función at al programador?

+1

¿Por qué está etiquetado Haskell pero usando la sintaxis de Scala? Después de todo, creo que la pregunta es independiente del idioma :-) – Bergi

Respuesta

20

Si bien un comportamiento se considera una función del tiempo, la dependencia de una cantidad arbitraria de datos pasados ​​en FRP es una cosa mala, y se conoce como fuga de tiempo. Es decir, las transformaciones en los comportamientos generalmente deberían ser de transmisión/reactiva en el sentido de que no dependen de una cantidad limitada del pasado (y deberían acumular este conocimiento de la historia explícitamente).

Por lo tanto, no, at no es deseable en un sistema de FRP real: no debería ser posible mirar al pasado o al futuro. (Esto último es, por supuesto, imposible, si el estado del futuro depende de algo externo al sistema FRP.)

Por supuesto, esto conduce al problema de que solo se puede mirar el exacto presente restringe severamente lo que puede hacer al escribir una función para transformar comportamientos: Behaviour a -> Behaviour b pasa a ser lo mismo que a -> b, lo que hace que muchas cosas que nos gustaría hacer sean imposibles. Pero esto es más un problema de encontrar una semántica, uno de los problemas persistentes de FRP, que cualquier otra cosa; siempre y cuando las transformaciones primitivas en los comportamientos que proporciones sean lo suficientemente potentes sin causar pérdidas de tiempo, todo debería estar bien. Para obtener más información al respecto, consulte Garbage collecting the semantics of FRP.

+1

Para ser claros: ¿Quiere decir que solo deberíamos poder calcular el valor de un Comportamiento 'ahora'? Siento que esto tiene mucho sentido, pero no puedo encontrar a Conal alguna vez explicando esto ... – seadowg

+1

Bueno, calcular el valor de un comportamiento "en un momento específico" es algo que no cubre el sistema FRP en sí; es una forma de relacionar el sistema FRP con el mundo exterior. Por ejemplo, en Haskell, dicha función podría ser 'value :: Behavior a -> IO a'. Pero FRP en abstracto existe en un mundo sin 'IO': dado que la definición de un comportamiento es un valor que cambia con el tiempo, la única forma de representar el valor actual de un comportamiento es ... ¡con un comportamiento! – ehird

+0

Pero, en lo que se refiere a pegar un sistema FRP a un lenguaje de host impuro, ya sea que no ofrezca interfaz para obtener el valor de un comportamiento (puede que no lo necesite) o que solo ofrezca una interfaz para obtener el valor actual tiempo, parece ser la mejor manera de ir a verme, por las razones que expuse en mi respuesta. El enlace de Conal que brindé fue solo por el tema semántico que mencioné en el último párrafo; no contiene ningún consejo sobre este asunto. – ehird

Cuestiones relacionadas