Ocaml中嵌套的“Let”表达式

时间:2017-03-25 11:49:25

标签: nested ocaml currying lambda-calculus

所有

如何在“Curry”语法中编写以下内容:

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

我开始尝试这样的事情:

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

然而,这似乎无法正确评估。

更好的是Lambda表达式可以看到绑定。

谢谢!

1 个答案:

答案 0 :(得分:1)

let v = e1 in e2将lambda演算转换为(\v.e2)(e1)(我使用反斜杠表示lambda)。所以,你的例子是

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

我使用alpha转换来区分具有相同名称的变量。观察到中间的f变为f1,即示例第三行f中的f y使用了f中定义的let第二行,而不是即将在第三行中定义的那一行。换句话说,你的定义不是递归的;您使用的是let rec,而不是let rec

开头:将Y翻译成lambda演算需要一个固定点组合Y(或类似技术)。 Y(f)的特点是f(Y(f))缩减为let rec v = e1 in e2的属性。然后,(\v.e2)(Y(\v.e1))大致翻译为=A1&", "