2015-11-04 5 views
0

Я пытаюсь понять комбинатор Y в OCaml. Я взял код от here, и я пытаюсь использовать его для записи функции Ackermann. В примерах в ссылке функции требуют только одного аргумента. Функция Ackermann требует двух аргументов, и из-за этого у меня остаются синтаксические ошибки. Код, который у меня есть до сих пор:Как вызвать функцию с несколькими аргументами, используя комбинатор Y в ocaml?

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

Что нужно сделать, чтобы заставить его работать? Благодарю.

ответ

3

Вы смешиваете карри с неопределенными определениями функций.

Вот Акер в последовательно uncurried форме:

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 
#