如何学习 OCaml

从零开始学习 OCaml 的入门概览


Exercism 提供练习和反馈,但对于第一次学习 OCaml 的人来说,可能不太容易上手。以下资源可以帮助你入门:

OCaml 的文档分散在多个项目中,很难查找,因为既有所谓的标准库(编译器自带的、相当精简的库),又有 Core 库(Jane Street 的一个独立项目,旨在提供一个更完整、更一致的标准库)。

令人困惑的是,标准库有时也被称为核心库(不过很少被称为 Core 库)。

Jane Street 的 Core 库是少数几道练习所必需的,但对所有练习都很有用。它分为三个部分:Base、Core_kernel 和 Core,每一层都扩展了前一层。大多数练习只需要 Base 就够了,但少数练习(例如涉及日期时)需要 Core_kernel。 要使用 Core,在你的代码顶部加上open Base或open Core_kernel。

例如,不用 List,而是从 Base.(https://ocaml.janestreet.com/ocaml-core/latest/doc/base/Base/List/) 得到一个遮蔽版本(open Base 会让它以 List 这个名字可用)。

标准库的 List 模块和 Core 的 List 之间有一些细微的差别,也有一些不那么细微的差别。例如,在标准库中 List.for_all 的签名是

val for_all : ('a -> bool) -> 'a list -> bool

而在 Core 库中它的签名是

val for_all : 'a t -> f:('a -> bool) -> bool

结果是,要检查一个列表中的所有数字是否都小于 10,使用编译器自带的 List 模块时你得这样写:

List.for_all (fun x -> x < 10) list

而使用 Core 的 List 模块时,你需要这样写:

List.for_all list (fun x -> x < 10)

或者(更好的写法):

List.for_all ~f:(fun x -> x < 10) list

一个建议:把重点放在 Core 库上,忽略标准库,除非你在 Core 里真的找不到需要的东西。