【PL理论深化】(5) Ocaml 语言:条件表达式 | if e1 then e2 else e3 | 使用 let 关键字定义变量 | let...in 表达式 | 函数式编程

  • 💬 写在前面:本章我们继续介绍如何使用 OCaml 进行函数式编程,讲解条件表达式 if e1 then e2 else e3,介绍如何使用 let 关键字和 let ... in 表达式定义变量。
  • 目录

0x00 条件表达式

0x01 变量:let 关键字

0x02 let...in 表达式


0x00 条件表达式

在编程语言中提供的最基本的语法之一是条件语句。

不同于 C 或 Java,OCaml 中的条件语句也是表达式,因此可以计算出一个值作为结果。

条件表达式 (conditional expression) 的形式如下所示:

这里的 e_1, e_2, e_3 是任意的表达式,条件表达式的意思是:

  • 如果 e_1 的值为真,则计算 e_2 的值
  • 如果 e_1 的值为假,则计算 e_3 的值

.

举个例子,当 e_1,e_2,e_3 分别为 2 > 1, 0 和 1 时:

# if 2 > 1 then 0 else 1;;
- : int = 0

因为表达式 2 > 1 的值为 true,所以计算 e_2 对应的表达式 0,并将其作为整个条件表达式的值

如果将条件更改为如下形式,则整个条件表达式的值将是 e_3 的值:

# if 2 < 1 then 0 else 1;;
- : int = 1

.

在 OCaml 中编写条件表达式时,需要遵循一些规则。

规则一: e_1 必须是布尔表达式,比如表达式 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

规则二:e_2 和 e_3 必须计算出相同类型的值。

例如,下面的表达式也会导致类型错误,并且无法执行:

# if true then 1 else true;;
Error: This expression has type bool but an expression
was expected of type int

规则二实际上是 OCaml 的静态类型系统要求的。

即使 e_1 和 e_2 的类型不同也可以执行程序,但这是在执行之前决定类型,这是必需的限制条件。

因此,具有静态类型系统的语言通常比动态语言在编写程序时要求更多规则。

0x01 变量:let 关键字

在 OCaml 中,变量是与值关联的名称,命名变量用 let 关键字

#let x = 3 + 4;;
val x : int 7
# let y = x + x;;
val y : int = 14

3 + 4 的值被称为 xx+x 的值被称为 y

这些定义的名称成为全局变量,在任何地方都可以访问。

0x02 let...in 表达式

要定义只在有限范围内有效的局部变量,可以使用 let...in 表达式。

在这个程序中,变量被定义为变量 x 取值 e_1。此时,变量 x 的作用域是 e_2

这意味着在表达式 e_2 中,最近定义的变量 x 是有意义的。

此外,因为 let...in 也是一个表达式,它会计算出一个值,这个值就是表达式 e_2 的值。

例如,考虑以下程序:

# let a = 1 in a * 2;;
- : int = 2

将变量 a 定义为 1 之后,计算a*2,并且这个值成为整个表达式的值。

在这种情况下,变量 a 仅在 e_2 中对应 a*2 时有效。

因此,在计算上述 let 表达式后,如果访问 a,则会发生错误:

# a;;
Error: Unbound value a

这意味着访问了未定义的变量 a

let x = e1 in e2 中,e_1 和 e_2 可以是任意表达式,可以像下面这样嵌套使用 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

全局变量 d 的值是通过嵌套的 let 定义的。

在上面的例子中,变量 a,b,c 是临时使用的局部变量,用于定义变量 d 的值,

因此在 d 被定义之后,这些变量就无法再访问了。

.

在下面的例子中,在 let 的 e_1 部分嵌套使用了 let:

# let x = (let y = 2 in y * 2) in x;;
- : int = 4
# y;;
Error: Unbound value y

在这种情况下,变量 y 也是用于定义 x 的局部变量。

因此,在整个表达式计算完成后,将无法访问 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

  • 34
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
前台: (1)注册登录模块:按照学校的相关规定进行注册和登录。 (2)招聘信息查看:高校毕业生们可以网站首页上查看所有的招聘信息,除此之外还可以输入公司名称或岗位名称进行搜索。 (3)用人单位模块:此模块为宣传用人单位的主要功能模块,具体包括用人单位简介、岗位需求及职责及公司介绍等功能。 (4)就业指导:学生朋友们在就业前可以通过此模块获取指导。 (5)新闻信息:为了让用户们可以了解到最新的新闻动态,本系统可以通过新闻信息查看功能阅读近期的新闻动态。 (6)在线论坛:毕业季的同学们可以通过此模块相互交流。 后台: (1)系统用户管理模块:可以查看系统内的管理员信息并进行维护。 (2)学生管理模块:通过此功能可以添加学生用户,还可以对学生信息进行修改和删除。 (3)用人单位管理模块:管理员用户通过此模块可以管理用人单位的信息,还可以对用人单位信息进行查看和维护。 (4)招聘管理模块:管理员通过此功能发布和维护系统内的照片信息。 (5)就业指导管理模块:通过此模块可以编辑和发布就业指导信息,从而更好的帮助就业季的同学们。 (6)论坛管理:通过论坛管理可以查看论坛中的主题帖及里面的回复信息,除此之外还可以对论坛中的信息进行维护和管理。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平渊道人

喜欢的话可以支持下我的付费专栏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值