了解嵌套在OCaml中的定义

时间:2013-10-15 12:09:04

标签: ocaml

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

3 个答案:

答案 0 :(得分:1)

let add x y = x + y in ....

定义一个本地函数,当给定xy时添加它们。它的定义仅在...中提供(在您的示例中,从;;

进入

重要的是要看到它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

编辑:天啊,我没注意到,用户已经消失了:/。