Concurrent Clean : Heap Full (3)

Heap Fullについて、MLに質問してみました。
それはそうと、以下のように頭部尾部正格リストを使って書いてみたところ、

reduce :: !(b a -> b) !b [!(.u -> (a, .u))!] !.u -> (!b, !.u)
reduce _ b [!!] u = (b, u)
reduce f b [!x:xs!] u
    # (a, u) = x u
    = reduce f (f b a) xs u

monte_carlo :== repeatn // Repeatn

cesaro_test r
    # (r1, r) = nextRand r
    # (r2, r) = nextRand r
    = (1 == gcd r1 r2, r)

estimate_pi trials
    # r = mkRandomInt
    # (frac, u) = (\(x,y) u = (x/y,u))
                    $$ reduce
                         (\(x,y) b = (if b (x+1.0) x, y+1.0))
                         (0.0,0.0)
                         [!a \\ a <- (monte_carlo trials cesaro_test)!] // monte_carlo trials cesaro_test
                         r
    = sqrt (6.0 / frac)

Start = estimate_pi 1000000

Stack overflow.しました。ちなみに、コメントのように書いたら、Heap Fullです。
もしかして、正格評価されて、リストが展開されてしまうからHeap Fullになってるのかな?
ABCコードを読んでみようか・・・