REAL WORLD OCAML

骆驼书桌

跟着免费的第二版,把书里的例子改到自己会写。类型、模式、模块,一次一课。

已掌握 0 / 17

两种数字

OCaml 不把 int 和 float 混在一个运算符里。

从第一课开始

语言本身

Language Concepts

从计算器走到模块。这些例子能在书桌里改完就跑。

  1. 01两种数字OCaml 不把 int 和 float 混在一个运算符里。8 分
  2. 02let 与函数函数就是值。类型是推出来的,不用先写签名。10 分
  3. 03标签、可选参数、管道Base 把容易看反的参数标上 ~f、~sep。顺序可以调。12 分
  4. 04列表不是数组:: 在头部加一个元素,便宜。@ 会把左边整条复制掉。10 分
  5. 05用模式把列表拆开destutter 是书里的例子:去掉相邻重复。12 分
  6. 06List 模块,而不是手写递归map、filter、fold 是同一条链表的三种看法。10 分
  7. 07尾递归递归调用如果是「做完才能返回」,栈会跟着列表长。10 分
  8. 08没有的值写成 None找不到不是异常。option 逼你在类型里把「没有」写出来。8 分
  9. 09记录与函数式更新{ p with y = 0. } 造一条新记录,p 还是原来的 p。10 分
  10. 10变体:一组互斥的形状颜色可以是命名色、RGB,或一个灰度。match 要把形状走完。12 分
  11. 11可预期的失败用 Result除以零是业务上可能发生的事,不必先变成异常。10 分
  12. 12ref 与 for需要状态时,把可变的那一格单独框起来。10 分
  13. 13模块是一层墙struct 是实现。签名决定外面能看见什么。12 分

程序里的形状

Tools and Techniques

Map 和 JSON。库是简化过的,类型的形状跟书一致。

  1. 14Map 记住比较方式树形 Map 要知道键怎么排序。这个信息待在类型里。10 分
  2. 15JSON 是一种变体外面的数据没有 OCaml 类型。先落成一个闭集,再投影成你的记录。10 分

类型与内存

Compiler and Runtime

GADT 细化类型,次堆为什么便宜。这两课靠推演,不靠编译。

  1. 16GADT:构造器携带类型等式普通变体做不到:同一条 expr,有的求值出 int,有的出 bool。14 分
  2. 17次堆、主堆、立即数大多数块活不长。次堆只复制还活着的那一点。12 分

例子按 Anil Madhavapeddy、Yaron Minsky、Jason Hickey 的 Real World OCaml 第二版编排。正文在 dev.realworldocaml.org,这里是练习,不是书的复制。