回

04 / 17 · Lists and Patterns

列表不是数组

:: 在头部加一个元素,便宜。@ 会把左边整条复制掉。

列表是不可变的单链表。1 :: 2 :: [] 从右往左长,因为 :: 右结合。取头用模式 first :: _,匹配不上空列表时会在运行时失败。

分号分隔元素,逗号做元组。这是书里最容易写错的一个字符。

例子

utop
let languages = ["OCaml"; "Perl"; "C"]
val languages : string list = ["OCaml"; "Perl"; "C"]
let my_favorite (first :: _) = first
val my_favorite : 'a list -> 'a = <fun>
my_favorite languages
- : string = "OCaml"
1 :: 2 :: []
- : int list = [1; 2]

改一改

改完再跑

解释器覆盖书前半的核心:函数、标签参数、模式、记录、变体、ref、模块,以及简化的 Map 和 JSON。没有 GADT 细化、Async 和独立编译。

先预测,再对照

1 / 2

[1, 2, 3] 是什么?

2 / 2

在长列表头部加一个元素,应该用?

在书里读 Lists and Patterns