Concurrent Clean : カウンタ
JavaScriptのクロージャを使ったカウンタを真似して、
function makeCounter () { var count = 0; return f; function f () { return count++; } }
Concurrent Cleanでも作ってみたけれど、よくみたら、ただの遅延ストリームだった。
::Counter a = Counter a (Counter a) makecounter = f count where count = [0..] f :: [a] -> Counter a f [c:r] = Counter c (f r) Start # counter = makecounter # (Counter c0 counter) = counter # (Counter c1 counter) = counter # (Counter c2 counter) = counter # (Counter c3 counter) = counter = [c0, c1, c2, c3]