On Thu, Jun 22, 2006 at 01:24:32PM +0200, Jerzy Karczmarczuk wrote:
> I believe that ways of producing intricate streams by such languages or
> Lustre are somehow based on continuation mechanisms. The paper on Esterel,
> etc. : ftp://ftp-sop.inria.fr/esterel/pub/papers/foundations.pdf
>
> gives you an example in Lustre
> X[n+1] = U[n+1]*sin(X[n] + S[n+1]-S[n])
> S[n+1] = cos(S[n]+U[n+1]
>
> in a form remarkably analogous as I did:
>
> node Control(U:float) returns X:float
> var S:float
> let
> X = 0.0 -> (U*sin(pre(X)+S-pre(S));
> S = 1.0 -> cos(pre(S)+U);
> tel
For comparison, here's a version using arrows (except that the U stream
is shifted forward, so its first value is used):
class ArrowLoop a => ArrowCircuit a where
delay :: b -> a b b
control :: ArrowCircuit a => a Float Float
control = proc u -> do
rec let x' = u * sin (x + s' - s)
s' = cos (s * u)
x <- delay 0 -< x'
s <- delay 1 -< s'
returnA -< x
One can plug in various implementations of ArrowCircuit. For stream
processors, delay is just cons, and the computation is equivalent to
the infinite list version. Another implementation uses continuations.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe