Let Expressions
Let表达式是一个非常重要的特性,可以以非常简单、通用、灵活的方式创建并使用局部变量,以使我们的代码风格更好,也可以使编码更方便,我们可以在其内部使用任何绑定,包括嵌套let
注意:let表达式就是一个普通的表达式,它可以在任何允许使用表达式的地方被使用
- 语法(syntax):
let b1 b2 ... bn in e end
其中:bi是任一绑定,e是任一表达式
let val a = 8
val b = 9
in
a+b
end
整个表达式返回:17
- 类型检查(type check)和 求值规则(evaluation rules):
- 类型检查
在一个包含早期绑定的静态环境(static environment)中,检查每个绑定bi和表达式e,整个Let表达式的类型就是e的类型。 - 求值规则
在一个包含早期绑定的动态环境(dynamic environment)中,计算每个绑定bi和表达式e,Let表达式的值就是e的值。
注意:若局部绑定内有与上级绑定相同名称,那么该局部绑定将会屏蔽外部绑定。
实例
fun silly1 (z : int) =
let val x = if z > 0 then z else 34
val y = x+z+9
in
if x > y then x*2 else y*y
end
fun silly2 () =
let val x = 1
in
(let val x = 2 in x+1 end) + (let val y = x+2 in y+1 end)
end
silly2的风格很糟糕,但这里只是想表达let只是一个普通的表达式。
新概念( scope)
let的引入,让我们意识到一个新概率,即绑定的使用是有范围( scope)的限制,如:我们不能在顶级绑定中,使用已定义的let内的定义的绑定。
fun silly3 () =
let val x = 3
in x
end
val bad-x = x
这里的x将是未定义的绑定,它不会使用到在let表达式中定义的任何x