4

我正在学习Jason Hickey 的 Objective Caml 简介。只是有一个关于表达的问题。


所以它说:

Definitions using let can also be nested using the in form.

let identifier = expression1 in expression2 The expression expression2 is called the body of the let. The variable named identifier is defined as the value of expression1 within the body. The identifier is defined only in the body expression2 and not expression1.

A let with a body is an expression; the value of a let expression is the value of the body.

let x = 1 in
    let y = 2 in
        x + y;;


let z =
    let x = 1 in
        let y = 2 in
            x + y;;

val z : int = 3


好的。我对上述说法不太了解。

第一的

The variable named identifier is defined as the value of expression1 within the body. The identifier is defined only in the body expression2 and not expression1.

这是什么意思?identifier也是如此the value of expression1,但只是在体内expression2?这是否意味着identifier仅在 中有效expression2但具有 的值expression1?那么定义是否identifier有意义,因为它只存在于expression2?

第二

让我们看看这个例子:

let x = 1 in
    let y = 2 in
        x + y;;

所以我不明白这个let声明的意义。x = 1当然,给身体的意义let y=2 in x+y;;何在?

第三

让 z = 让 x = 1 在让 y = 2 在 x + y 中;;

那么如何理清这句话的逻辑呢?

如果采用这种定义形式:let identifier = expression1 in expression2

expression1上面的let陈述是什么?是let x = 1吗?


谁能告诉我nesting let某种Java方式的逻辑?或更容易理解的方式?

4

2 回答 2

4

这是什么意思?那么identifier就是expression1的值,但只在body expression2中?是不是说identifier只在expression2中有效,却有expression1的值?

是的。当我这样做时let x = 42 in x+x,则在表达式中x具有值,但在表达式之外没有任何值。因此,如果您在解释器中输入这样的内容:42x+xxlet

let x = 42 in x+x;;
x*2;;

的结果x+x会是84,但结果x*2会是错误的,因为x没有在该范围内定义。

那么定义标识符是否有意义,因为它只在表达式2中?

当然,为什么不呢?我的意思是在这个被定义为单个数字的特定示例中x,它可能没有那么大的意义,但在现实世界的场景中,它可能是一个更大的表达式,并且不必多次重复它成为一个很大的优势.

expression1可能有你只想执行一次的副作用(例如,如果你想将用户输入分配给一个变量)。

所以我不明白这个 let 声明的意义。x = 1 当然,在 x+y;; 中给出 let y=2 的主体有什么意义?

你的意思是:为什么不直接写1+2?同样,在现实世界的场景中,您将拥有更复杂的表达式,并且您不想将它们全部放在一行上。也给值命名通常会增加可读性(尽管在这个例子中不是真的)。

让 z = 让 x = 1 在让 y = 2 在 x + y 中;;

上面 let 语句中的表达式 1 是什么?是否让 x = 1?

let z = ...是一个let声明,即它在z全局范围内定义名称并且没有正文。所以第一个右边的整个表达式=是 的值z。对于let x = ... in ...位,1expression1并且let y = 2 in x+yexpression2。和 fory 2expression1并且x+yexpression2

于 2012-11-30T17:26:10.887 回答
1

这是什么意思?那么identifier就是expression1的值,但只在body expression2中?这是否意味着标识符只在表达式2中有效但具有表达式1的值?那么定义标识符是否有意义,因为它只在表达式2中?

是的,这就是它的意思,但更简单地说,它意味着您不能“以其自身的价值”使用标识符。将表达式 1 的值绑定到标识符后,您可以在表达式 2 中使用标识符而不是整个表达式 1。

一般来说,使用绑定有两个原因;1 是为了防止对给定表达式进行多次评估,2 是为了清楚起见:为相对复杂的表达式的值赋予人类可读的名称通常很有用。

在 Java 中,一个 let 绑定大致对应于一个局部变量。

于 2012-11-30T17:22:49.187 回答