
David Barbour wrote:
Alan Jeffrey wrote:
A function (f : Beh A -> Beh B) is causal whenever it respects =t, i.e. (forall t . a =t b => f a =t f b).
Yes. Function outputs only depend on the past values of the input function.
Your solutions for double and weird are accurate. Double is lifting the future at each instant into the present, which is obviously not causal. And the `weird` function presumes you already have a obtained a complete view of a behavior at each instant.
The `problem` such as it exists: you will be unable to causally construct the argument to the `weird` function, except by modeling a nested/simulated world (i.e. modeling one FRP system within another). This is not an unrealistic endeavor, e.g. one might model the future position of a thrown baseball in order to predict it. In this sense, `weird` is not weird.
I concur with that. The function double :: Behavior a -> Behavior (Behavior a) double x = const x is not causal because it makes all future values of the behavior x available "at once". However, weird :: Behavior (Behavior a) -> Behavior a weird = join . fmap (. (+1)) where join a t = a t t is clearly causal as a composition of two causal functions. The point is that the innermost behavior was already available "in full", so it's perfectly possible to evaluate it at any time desired. Of course, the function double' x t = \t' -> if t' <= t then x t' else _|_ is causal. Best regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com