关于本书

报告错误。如果您发现错误,请报告!或者如果您对如何重写书中的某部分有建议,请告诉我们。只需转到您想提出建议的书页,点击页面右上角附近的 GitHub 图标(看起来像只猫),然后点击“打开问题”或“建议编辑”。后者稍微复杂一些,因为它要求您使用 GitHub 分叉教材存储库。但对于将受到赞赏并导致建议更快被采纳的小修改。

背景。这本书在康奈尔大学用于第三学期的编程课程。大多数学生已经学过一学期的 Python 入门编程,然后是一学期的 Java 面向对象编程。因此,经常会将这两种语言进行比较。已经学过类似语言的读者应该没有任何难度跟上。这本书不假设读者有任何函数式编程的先前知识,但假设读者有在某种主流命令式语言中编程的经验。还假设读者具有标准第一学期计算机科学课程水平的离散数学知识。

视频。您将在本书中找到超过 200 个嵌入的 YouTube 视频。这些视频通常为材料提供介绍,然后教科书进行扩展。这些视频是在大流行期间制作的,当时使用这本教科书的康奈尔课程 CS 3110 必须是异步的。学生对它们的反应非常积极,因此它们现在作为教科书的一部分公开发布。但是请注意,它们并不是由专业的音视频团队制作的 - 只是一个在地下室里学习的人。

视频主要使用了 2020 年秋季流行的 OCaml 及其生态系统的版本。您目前使用的版本可能与视频中的版本有所不同,但不要惊慌:基本思想是相同的。最明显的区别可能是 OCaml 的 VS Code 插件。在 2020 年秋季,仍在使用过时的“OCaml 和 Reason IDE”插件。它已被“OCaml 平台”插件取代。

教科书和视频有时以不同的顺序涵盖主题。视频放置在最接近其涵盖主题的教科书中。要按照原始顺序观看视频,请从这个 YouTube 播放列表开始。

协作式注释。在每页的右边缘,您会发现由 hypothes.is 提供的注释功能。您可以在学习文本时使用它来突出显示和做私人笔记。您可以组建学习小组来分享您的注释,或者公开分享它们。查看这些有效注释的技巧。

可执行代码。本书的许多页面中嵌入了 OCaml 代码。该代码的输出已经显示在书中。以下是一个例子:

print_endline "Hello world!"
Hello world!
- : unit = ()

您也可以编辑并重新运行代码,以便进行实验并检查您的理解。在页面右上方附近寻找一个看起来像火箭船的图标。在下拉菜单中,您会找到两种与代码交互的方式:

  • Binder 将推出网站 mybinder.org,这是一个免费的基于云的服务,用于“在规模上实现可重现、交互式、可共享的科学环境”。所有计算都在他们的云服务器中进行,但用户界面通过您的浏览器提供。在 Binder 中打开教科书页面可能需要一点时间。一旦打开,您可以在 Jupyter 笔记本中编辑和运行代码。Jupyter 笔记本是文档(通常以 .ipynb 扩展名结尾),可以在 Web 浏览器中查看,并用于撰写叙述内容以及代码。它们在数据科学社区(特别是 Python、R 和 Julia)中变得流行,作为分享分析的一种方式。现在许多语言都可以在 Jupyter 笔记本中运行,包括 OCaml。在 Jupyter 笔记本中,代码和文本以单元格形式编写。查看其中的“Cell”菜单以获取运行单元格的命令。请注意,Shift-Enter 通常是运行具有焦点的单元格的快捷键。

  • 实时代码实际上会做大致相同的事情,只是不会离开当前的教材页面并将您带到 Binder,而是会修改页面上的代码单元格以便进行编辑。在幕后建立连接需要一些时间,在此期间您会看到“等待内核”的提示。连接建立后,您可以编辑页面上的所有代码单元格并重新运行它们。如果连接失败,那么首先启动 Binder 站点;这可能需要很长时间。在成功连接并将教材页面加载为 Jupyter 笔记本后,您可以关闭 Binder,重新加载教材页面,然后再次启动实时代码。这时连接应该会相对快速地成功。

尝试与上面的单元格进行交互,让它打印出您选择的字符串。比如: "Camels are bae."

当您编写“真实”的 OCaml 代码时,这不是您将使用的界面。您将在诸如 Visual Studio Code 或 Emacs 之类的编辑器中编写代码,并从终端编译它。Binder 和 Live Code 仅用于与教科书无缝交互。

可下载页面。本书的每一页都可以以多种格式下载。下载图标位于每一页的右上角。您总是可以找到页面的原始源代码,通常是 Markdown——更确切地说是 MyST Markdown,这是 Markdown 的技术写作扩展。每一页也可以单独作为 PDF 下载,只需从您的浏览器中打印即可。有关整本书的 PDF,请参见下面的段落。

包含 OCaml 代码单元格的页面也可以下载为 Jupyter 笔记本。要在本地计算机上运行这些笔记本(而不是在 Binder 云端运行),您需要安装 Jupyter。通常最简单的方法是安装 Anaconda。然后您需要安装 OCaml Jupyter,这需要您已经安装了 OCaml。需要明确的是,无需安装 Jupyter 或使用笔记本。这只是与本教材互动的另一种方式,超越阅读。

练习和解答。除第一章外,每章末尾都有一节练习。练习附有难度评级:

  • 一颗星[★]:简单的练习,只需一两分钟。
  • 两颗星[★★]:直接的练习,应该只需要几分钟。
  • 三星[★★★]:可能需要五到二十分钟左右的练习。
  • 四颗星或更多星:为那些希望深入学习材料的学生提供具有挑战性或耗时的练习。

有时候我们可能会误判问题的难度。如果您认为某个注释有误,请告诉我们。

请不要在任何地方发布您对练习的解决方案,尤其是不要在公共存储库中发布,以免被搜索引擎发现。大多数练习的解决方案都已提供。2022 年秋季是这些解决方案的首次公开发布。尽管这些解决方案已经提供给康奈尔大学的学生几年了,但更广泛的传播将揭示可以进行改进的地方。我们很乐意添加或更正解决方案。请通过 GitHub 进行贡献。

PDF。本书提供完整的 PDF 版本。它不包含 HTML 版本具有的嵌入视频、注释或其他功能。可能还存在排版错误。目前尚无平板电脑(ePub 等)版本,但大多数平板电脑可以导入 PDF 文件。