回

09 / 17 · Records

记录与函数式更新

{ p with y = 0. } 造一条新记录,p 还是原来的 p。

字段名就是构造器的一部分。{ x; y } 是 { x = x; y = y } 的简写,模式里同样能这么拆。

magnitude 用模式把两个 float 拿出来。3. 和 -4. 的斜边是 5.。更新 y 之后,x 仍从旧记录里拷过来。

例子

utop
type point = { x : float; y : float }
type point
let p = { x = 3.; y = -4. }
val p : point = { x = 3.; y = -4. }
let magnitude { x; y } =
  Float.sqrt (x *. x +. y *. y)
val magnitude : point -> float = <fun>
magnitude p
- : float = 5.
let on_x = { p with y = 0. }
val on_x : point = { x = 3.; y = 0. }
on_x.x
- : float = 3.

改一改

改完再跑

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

先预测,再对照

1 / 2

magnitude { x = 3.; y = -4. } 是?

2 / 2

let q = { p with y = 0. } 之后,p.y 是?

在书里读 Records