【问题标题】:Nested "Let" expressions in OcamlOcaml 中的嵌套“Let”表达式
【发布时间】:2017-03-25 11:49:24
【问题描述】:

全部:

如何在“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 表达式来查看绑定。

谢谢!

【问题讨论】:

    标签: nested ocaml currying lambda-calculus


    【解决方案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 y中的f使用了第二行定义的f,而不是即将使用的f在第三行中定义。换句话说,您的定义不是递归的;你使用的是let,而不是let rec。

    题外话:将let rec 转换为 lambda 演算需要一个定点组合器Y(或一些类似的技术)。 Y 的特点是Y(f) 减少到f(Y(f)) 的性质。然后,let rec v = e1 in e2 大致翻译为(\v.e2)(Y(\v.e1))。

    【讨论】:

    • 太棒了。我熟悉 a 转换,但我不认为 OCaml 语法完全相同,并且那些确实是“不同”的 y。另外:喜欢题外话。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2012-04-28
    • 2019-10-14
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多