回

10 / 17 · Variants

变体:一组互斥的形状

颜色可以是命名色、RGB,或一个灰度。match 要把形状走完。

of int * int * int 是一个元组参数,不是三个参数。所以写成 RGB (r, g, b),括号属于那个元组。

书后半会提醒:通配符 _ 能让编译通过,但以后加一种颜色时,编译器就不再逼你更新每一处 match。能写全的地方就写全。

例子

utop
type basic_color =
  | Black
  | White
  | Red
  | Green
  | Blue
type basic_color
type color =
  | Basic of basic_color
  | RGB of int * int * int
  | Gray of int
type color
let to_rgb c =
  match c with
  | Basic Black -> (0, 0, 0)
  | Basic White -> (255, 255, 255)
  | Basic Red -> (255, 0, 0)
  | Basic Green -> (0, 255, 0)
  | Basic Blue -> (0, 0, 255)
  | RGB (r, g, b) -> (r, g, b)
  | Gray i -> (i, i, i)
val to_rgb : color -> int * int * int = <fun>
to_rgb (Basic Red)
- : int * int * int = (255, 0, 0)
to_rgb (Gray 128)
- : int * int * int = (128, 128, 128)
to_rgb (RGB (12, 80, 200))
- : int * int * int = (12, 80, 200)

改一改

改完再跑

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

先预测,再对照

1 / 2

to_rgb (Gray 128) 是?

2 / 2

RGB of int * int * int 表示?

在书里读 Variants