Concurrent Clean : アキュームレータ

[id:sumim:20060327:p1]のコメント欄で、代入の件で勘違いした件について、そういう時は、Cleanはどう書くのかを考えてみました。

Start w = w --> stdio
            --> \(f,w) = f --> printAc 1
                           --> flip fclose w
                           --> snd

printAc n f = f --> (n --> (+) 2
                       --> (+) 3
                       --> (+) 5
                       --> (+) -10
                       --> fwritei)
                --> fwrites "\n"

これで用は足りるかな?
計算途中で出力をしたい場合はこうかな?

printAc n f = (n,f) --> ac 2   --> fwriteiln
                    --> ac 3   --> fwriteiln
                    --> ac 5   --> fwriteiln
                    --> ac -10 --> fwriteiln
                    --> return
  where
    ac i (n,f) = (i+n,f)
    fwriteiln (i,f) = (i, f --> fwritei i --> fwrites "\n")
    return (_,f) = f