如何學習 OCaml

從零開始學 OCaml 的入門總覽。


Exercism 提供練習和回饋,但對第一次學 OCaml 的人來說,可能不太容易上手。以下這些資源可以幫助你入門:

OCaml 的說明文件散落在多個專案中,因此並不好找,因為其中有時被稱為標準函式庫的函式庫(也就是編譯器隨附、相當精簡的那個函式庫),還有一個 Core 函式庫(Jane Street 的獨立專案,目標是提供更完整、更一致的標準函式庫)。

容易搞混的是,標準函式庫有時也被稱為 core library(不過很少被寫成 Core library)。

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 裡真的找不到需要的東西。