1

OCaml の Y コンビネータを理解しようとしています。hereからいくつかのコードを取得し、それを使用して Ackermann 関数を記述しようとしています。リンクの例では、関数に必要な引数は 1 つだけです。アッカーマン関数には 2 つの引数が必要なため、構文エラーが発生し続けます。私がこれまでに持っているコードは

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));;

機能させるにはどうすればよいですか?ありがとう。

4

1 に答える 1

3

カリー化された関数定義とカリー化されていない関数定義が混在しています。

以下は、一貫してカリー化されていない形式の 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
# 
于 2015-11-04T05:27:03.597 に答える