- 💬 写在前面:本章我们继续介绍如何使用 OCaml 进行函数式编程,讲解条件表达式 if e1 then e2 else e3,介绍如何使用 let 关键字和 let ... in 表达式定义变量。
- 目录
0x00 条件表达式
在编程语言中提供的最基本的语法之一是条件语句。
不同于 C 或 Java,OCaml 中的条件语句也是表达式,因此可以计算出一个值作为结果。
条件表达式 (conditional expression) 的形式如下所示:
这里的 是任意的表达式,条件表达式的意思是:
- 如果
的值为真,则计算
的值
- 如果
的值为假,则计算
的值
.
举个例子,当 分别为 2 > 1, 0 和 1 时:
# if 2 > 1 then 0 else 1;;
- : int = 0
因为表达式 2 > 1 的值为 true,所以计算 对应的表达式 0,并将其作为整个条件表达式的值
如果将条件更改为如下形式,则整个条件表达式的值将是 的值:
# if 2 < 1 then 0 else 1;;
- : int = 1
.
在 OCaml 中编写条件表达式时,需要遵循一些规则。
规则一: 必须是布尔表达式,比如表达式 if 1 then 2 else 3 在编译阶段,会引发类型错误:
# if 1 then 2 else 3;;
Error: This expression has type int but an expression
was expected of type bool
规则二: 和
必须计算出相同类型的值。
例如,下面的表达式也会导致类型错误,并且无法执行:
# if true then 1 else true;;
Error: This expression has type bool but an expression
was expected of type int
规则二实际上是 OCaml 的静态类型系统要求的。
即使 和
的类型不同也可以执行程序,但这是在执行之前决定类型,这是必需的限制条件。
因此,具有静态类型系统的语言通常比动态语言在编写程序时要求更多规则。
0x01 变量:let 关键字
在 OCaml 中,变量是与值关联的名称,命名变量用 let 关键字
:
#let x = 3 + 4;;
val x : int 7
# let y = x + x;;
val y : int = 14
3 + 4 的值被称为 ,
的值被称为
。
这些定义的名称成为全局变量,在任何地方都可以访问。
0x02 let...in 表达式
要定义只在有限范围内有效的局部变量,可以使用 let...in 表达式。
在这个程序中,变量被定义为变量 x 取值 。此时,变量 x 的作用域是
。
这意味着在表达式 中,最近定义的变量 x 是有意义的。
此外,因为 let...in 也是一个表达式,它会计算出一个值,这个值就是表达式 的值。
例如,考虑以下程序:
# let a = 1 in a * 2;;
- : int = 2
将变量 定义为 1 之后,计算
,并且这个值成为整个表达式的值。
在这种情况下,变量 仅在
中对应
时有效。
因此,在计算上述 let 表达式后,如果访问 ,则会发生错误:
# a;;
Error: Unbound value a
这意味着访问了未定义的变量 。
在 let x = e1 in e2
中, 和
可以是任意表达式,可以像下面这样嵌套使用 let:
# let d =
let a = 1 in
let b = a + a in
let c = b + b in
c + c;;
val d : int = 8
# d;;
- : int = 8
# a;;
Error: Unbound value a
# b;;
Error: Unbound value b
# c;;
Error: Unbound value c
全局变量 的值是通过嵌套的 let 定义的。
在上面的例子中,变量 是临时使用的局部变量,用于定义变量
的值,
因此在 被定义之后,这些变量就无法再访问了。
.
在下面的例子中,在 let 的 部分嵌套使用了 let:
# let x = (let y = 2 in y * 2) in x;;
- : int = 4
# y;;
Error: Unbound value y
在这种情况下,变量 也是用于定义
的局部变量。
因此,在整个表达式计算完成后,将无法访问 。
📌 [ 笔者 ] 王亦优
📃 [ 更新 ] 2022.9.14
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!
📜 参考资料 - R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015. - T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。 - T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018. - J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005. - R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011 - S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。 - S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。 - E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993 - S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008. - A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974. - M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997. - A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. Hopcroft, and J. Ullman, Data Structures and Algorithms, Addison-Wesley, 1983. - E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997. - R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998 - R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002 |