Concurrent Clean : Heap Full (4)

結局、無名関数に名前をつけて、正格性の注釈を入れてやることで、正常に終了するようになりました。

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

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

estimate_pi trials
    # (frac, u) = (\(x,y) u = (x/y,u))
                    $$ reduce
                         f
                         (0.0,0.0)
                         (repeatn trials cesaro_test)
                         mkRandomInt
    = sqrt (6.0 / frac)
  where
    f :: (!Real, !Real) !Bool -> (!Real, !Real)
    f (x,y) b = (if b (x+1.0) x, y+1.0)

Start = estimate_pi 1000000

このようにしてもOK

`` :: (!a, !b) -> (!a, !b)
`` (a, b) = (a, b)

estimate_pi trials
    # (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)
                         (repeatn trials cesaro_test)
                         mkRandomInt
    = sqrt (6.0 / frac)

タプルの正格性は自動判別で、正格タプルというものはないみたい。(内部的には区別しているようだが)