Functional programming 如何理解;出租房屋的主体;?

Functional programming 如何理解;出租房屋的主体;?,functional-programming,ocaml,Functional Programming,Ocaml,我在学习。只是有一个关于表达的问题 所以它说: 使用let的定义也可以使用in表单嵌套。 let identifier=expression2中的expression1 表达式expression2称为let的主体。名为identifier的变量 定义为主体中表达式1的值。标识符仅在中定义 正文表达式2和非表达式1。 带主体的let是一个表达式;let表达式的值是 车身。 let x = 1 in let y = 2 in x + y;; let z =

我在学习。只是有一个关于表达的问题


所以它说:

使用let的定义也可以使用in表单嵌套。

let identifier=expression2中的expression1

表达式expression2称为let的主体。名为identifier的变量
定义为主体中表达式1的值。标识符仅在中定义
正文表达式2和非表达式1。

带主体的let是一个表达式;let表达式的值是
车身。

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


嗯。我不太明白上面的说法

弗斯特
名为identifier的变量
定义为主体中表达式1的值。标识符仅在中定义
正文表达式2和非表达式1。

这是什么意思?所以
标识符
表达式1
的值,但仅在主体
表达式2
中?这是否意味着
identifier
仅在
expression2
中有效,但其值为
expression1
?那么定义
标识符
有意义吗,因为它只存在于
表达式2中

第二 让我们来看一个例子:

let x = 1 in
    let y = 2 in
        x + y;;
所以我看不出这个
let
语句的意义
x=1
当然,给出一个
体,让y=2在x+y;,有什么意义

第三 让z= 设x=1英寸 设y=2英寸 x+y

那么我怎样才能理清这句话的逻辑呢

如果采用此定义形式:
let identifier=expression2中的expression1

上面的
let
语句中的
expression1
是什么?是不是
让x=1


有谁能以
Java
的方式告诉我
嵌套let
的逻辑吗?还是更容易理解的方式?

这是什么意思?所以identifier是expression1的值,但是 只是在身体表情上?这是否意味着标识符是正确的 仅在表达式2中有效,但表达式1的值是否为?然后 定义标识符有意义吗,因为它只存在于表达式2中

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

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

就Java而言,let绑定大致相当于一个局部变量

这是什么意思?标识符是expression1的值,但只在主体expression2中?这是否意味着标识符仅在表达式2中有效,但其值为表达式1

对。当我在x+x中设置x=42时,那么
x
在表达式
x+x
中具有值
42
,但是
x
let
表达式之外没有任何值。因此,如果您在解释器中键入类似的内容:

let x = 42 in x+x;;
x*2;;
x+x
的结果将是
84
,但
x*2
的结果将是错误的,因为
x
未在该范围内定义

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

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

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

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

你的意思是:为什么不直接写
1+2
?同样,在现实世界中,你会有更复杂的表达式,你不希望它们都在一行上。另外,为值命名通常会增加可读性(尽管在本例中并非如此)

设z=设x=1 in设y=2 in x+y

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


这里的
let z=…
是一个
let
语句,即它全局定义名称
z
,没有正文。因此,第一个
=
右侧的整个表达式是
z
的值。对于
让x=。。。在…
位中,
1
表达式1
让x+y中的y=2
表达式2
。对于
y
2
表达式1
x+y
表达式2

A
C
语句序列
x=1;y=2;返回x+y
被翻译成ML
让x=1 in y=2 in x+y
。记住,ML中没有语句,一切都是一个表达式。逻辑非常简单——把
让x=y在z
中看作
(fun x->z)y
的语法糖
s只是在主体范围内定义值的方法。所以如果我说
让x=12
,然后定义
x
,我以后可以在任何地方使用它。如果我说
x+x'中的x=12,那么定义了
x',并且只能在
x+x
中使用,对吗?谢谢。那么,关于示例的
z
部分,真正重要的部分是
后面的x+y
。对于
let z
没有
let体
,整个
let x=1 in let y=2 in x+y
是一个表达式。我说得对吗?谢谢你。s