我正在努力理解OCaml中的Y组合子。我从这里获取了一些代码,并试图用它来编写Ackermann函数。在链接中的示例中,函数只需要一个参数。Ackermann函数需要两个参数,因此我一直有语法错误
type 'a mu = Roll of ('a mu -> 'a);;
let unroll (Roll x) = x;;
let fix f = (fun x a -> f (unroll x x) a) (Roll (fun x a -> f (unroll x x) a));;
let acker f = function
0, n -> n + 1
| m, 0 -> f (m-1) 1
| m, n -> f (m-1) (f m (n-1))
;;
print_int (fix (acker 2 2));;
我需要做些什么才能让它发挥作用?谢谢
您正在混合curried和未carried的函数定义。
这是一个一贯未结的acker:
let acker f = function
0, n -> n + 1
| m, 0 -> f (m - 1, 1)
| m, n -> f (m - 1, f (m, n - 1));;
这里有一个电话:
# fix acker (2, 2);;
- : int = 7
#