通りすがりの者なので遅レスですが。

>>248
tuple 使わないで let rec f x y z = ...
と書いてあげれば少し速くなるはずです。
参考→http://caml.inria.fr/FAQ/FAQ_EXPERT-eng.html#curried

>>252
先頭のackermann関数しか見てませんが...
if-then-else を全部一行で書いてるとか言うのは置いといて
関数本体は、書きたければ、こう書くこともできます

let rec ack = function
 | (0, n) -> n + 1
 | (m, 0) -> ack (m - 1, 1)
 | (m, n) -> ack (m - 1, ack (m, n - 1))