NB. Definitions used in the Algorithms Chapter sum_ones =: monad define if. y = 0 do. 0 else. 1 + sum_ones y - 1 end. ) traced_sum_ones =: monad define entering y if. y = 0 do. leaving 0 else. leaving 1 + traced_sum_ones y - 1 end. ) sum_ones1 =: monad def 'sum_ones_iter y , 0 1' sum_ones_iter =: monad define 'n acc i' =. y if. i > n do. acc else. sum_ones_iter n , (acc + 1) , i + 1 end. ) traced_sum_ones1 =: monad def 'traced_sum_ones_iter y , 0 1' traced_sum_ones_iter =: monad define entering y 'n acc i' =. y if. i > n do. leaving acc else. traced_sum_ones_iter n , (acc + 1) , i + 1 end. ) sum =: monad define if. y = 0 do. 0 else. y + sum y - 1 end. ) traced_sum =: monad define entering y if. y = 0 do. leaving 0 else. leaving y + traced_sum y - 1 end. ) sum1 =: monad def 'sum_iter y , 0 1' sum_iter =: monad define 'n acc i' =. y if. i > n do. acc else. sum_iter n , (acc + i) , i + 1 end. ) traced_sum1 =: monad def 'traced_sum_iter y , 0 1' traced_sum_iter =: monad define entering y 'n acc i' =. y if. i > n do. leaving acc else. traced_sum_iter n , (acc + i) , i + 1 end. ) fact =: monad define if. y < 1 do. 1 else. y * fact y - 1 end. ) traced_fact =: monad define entering y if. y < 2 do. leaving 1 else. leaving y * traced_fact y - 1 end. ) fact1 =: monad def 'fact_iter y , 1 1' fact_iter =: monad define 'n acc i' =. y if. i > n do. acc else. fact_iter n , (i * acc) , i + 1 end. ) traced_fact1 =: monad def 'traced_fact_iter y , 1 1' traced_fact_iter =: monad define entering y 'n acc i' =. y if. i > n do. leaving acc else. traced_fact_iter n , (i * acc) , i + 1 end. ) fibonacci =: monad define if. y < 2 do. y else. (fibonacci y - 1) + fibonacci y - 2 end. ) traced_fibonacci =: monad define entering y if. y < 2 do. leaving y else. leaving (traced_fibonacci y - 1) + traced_fibonacci y -2 end. ) fib_work =: monad define if. y < 2 do. 1 else. 1 + (fib_work y - 1) + fib_work y - 2 end. ) fibonacci1 =: monad def 'fib_iter 1 0 , y' fib_iter =: monad define 'a b count' =. y if. count = 0 do. b else. fib_iter (a + b) , a , count - 1 end. ) traced_fibonacci1 =: monad def 'traced_fib_iter 1 0 , y' traced_fib_iter =: monad define entering y 'a b count' =. y if. count = 0 do. leaving b else. traced_fib_iter (a + b) , a , count - 1 end. )