2017-03-25 2 views
1

Tous:Nested "Que" expressions en OCaml

Comment puis-je écrire ce qui suit dans la syntaxe "Curry":

let y = 2 in 
let f x = x + y in 
let f x = let y = 3 in f y in 
f 5 

je tout d'abord essayé quelque chose comme ceci:

(y -> (f -> ((f x -> f 5) (y -> f y) 3)) x + y) 2 

Cependant, cela ne semble pas évaluer correctement.

Encore mieux serait une expression Lambda pour voir la liaison.

Merci!

Répondre

1

let v = e1 in e2 traduit en lambda-calcul comme (\v.e2)(e1) (où j'utilise le backslash pour désigner un lambda). Donc, votre exemple serait

(\y1.(\f1.(\f2.f2 5)(\x2.(\y2.f1(y2))(3)))(\x1.x1+y1))(2) 

J'ai utilisé la conversion alpha pour différencier les variables qui autrement auraient le même nom. Observez que le f dans le milieu est devenu , c'est le f dans f y dans la troisième ligne de votre exemple utilise le f défini dans la deuxième ligne, pas celui qui est sur le point d'être défini dans la troisième ligne. En d'autres termes, votre définition n'est pas récursive; vous avez utilisé let, et non let rec. Digression: La traduction de let rec dans le calcul lambda nécessite un combinateur de points fixes Y (ou une technique similaire). Y est caractérisé par la propriété que Y(f) se réduit à f(Y(f)). Ensuite, let rec v = e1 in e2 se traduit à peu près (\v.e2)(Y(\v.e1)).

+0

Merveilleux. Je suis familier avec la conversion A mais je n'ai pas supposé que la syntaxe d'OCaml était exactement la même et que ceux-ci étaient en effet "différents". Aussi: aimez la digression. – Krpcannon