2015-11-04 2 views
0

J'essaie de comprendre le combinateur Y dans OCaml. J'ai pris du code de here, et j'essaie de l'utiliser pour écrire la fonction Ackermann. Dans les exemples du lien, les fonctions ne nécessitent qu'un seul argument. La fonction Ackermann nécessite deux arguments, et je continue à avoir des erreurs de syntaxe à cause de cela. Le code que j'ai jusqu'à maintenant estComment appeler une fonction avec plusieurs arguments en utilisant le combinateur Y dans 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));; 

Que dois-je faire pour que cela fonctionne? Merci.

Répondre

3

Vous mélangez des produits carnés avec des définitions de fonctions non-séchées.

est ici acker sous une forme cohérente uncurried:

let acker f = function 
    0, n -> n + 1 
| m, 0 -> f (m - 1, 1) 
| m, n -> f (m - 1, f (m, n - 1));; 

Voici un appel:

# fix acker (2, 2);; 
- : int = 7 
#