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