
Thanks for the prompt reply. Some questions / comments below :
On Wed, Sep 1, 2010 at 12:33 AM, Maciej Piechotka
rSum2 :: ArrowCircuit a => a Int Int rSum2 = proc x -> do rec out <- delay 0 -< out + x returnA -< out + x
Wow, that was simple. I guess I never thought to do this because it evaluates (out + x) twice, but one can always write rSum3 :: ArrowCircuit a => a Int Int rSum3 = proc x -> do rec let next = out + x out <- delay 0 -< next returnA -< next I have a follow-up question which I'll ask in a new thread.
3) One can define fix in terms of trace and trace in terms of fix.
trace f x = fst $ fix (\(m, z) -> f (x, z)) fix f = trace (\(x, y) -> (f y, f y)) undefined
Does this mean we can translate arbitrary recursive functions into ArrowLoop equivalents?
Yes. In fact fix is used on functional languages that do not support recursion to have recursion (or so I heard)
In which case my question is, why is the primitive for Arrows based on trace instead of fix? Best regards, Ben