let quad x = let add x y = x + y in
let double x = add x x in
double x + double x;;
我无法理解它如何计算输入的4倍。 我理解像
这样的表达let x = 1 in let x = x+2 in let x = x+3 in x
评估为
(x -> x = x+2 in let x = x+3 in x) 1
答案 0 :(得分:1)
let add x y = x + y in ....
定义一个本地函数,当给定x
和y
时添加它们。它的定义仅在...中提供(在您的示例中,从;;
重要的是要看到它let add x y =
创建一个新的x
绑定,而不是四边形中定义的x
。
这与ocaml相当,但可能更清楚:
let quad x = let add a b = a + b in
let double c = add c c in
double x + double x;;
答案 1 :(得分:1)
除了名称的可见性之外,您的版本与此之间没有区别:
let add x y = x + y;;
let double x = add x x;;
let quad x = double x + double x;;
考虑它的方式是“在”中创建一个新的范围。 x从外部范围隐藏x。每个绑定的名称都是新的,与之前绑定的任何名称无关。让我们伸手吧:
quad 1 = double 1 + double 1 main函数的变量进入函数体。所有let .. in stuff只是一个接一个,直到它们被使用。 Double被使用,所以我们现在用参数调用sub函数。
double 1 = add 1 1根据let中的定义展开Double。
add 1 1 = 1 + 1根据let中的定义展开Add。
答案 2 :(得分:0)
根据add
的定义,最后一个表达式可以重写为
double x + double x = add (double x) (double x)
再次定义add
:
add (double x) (double x) = add (add x x) (add x x)
现在是时候扩展了:
add (add x x) (add x x) = (add x x) + (add x x)
= (x + x) + (x + x)
= x + x + x + x
编辑:天啊,我没注意到,用户已经消失了:/。