回

03 / 17 · Variables and Functions

标签、可选参数、管道

Base 把容易看反的参数标上 ~f、~sep。顺序可以调。

?sep 表示调用时可以不写。没写时,函数体里的 sep 是 None,不是空字符串。空字符串是你在 match 里自己决定的默认值。

xs |> f 就是 f xs。管道的优先级低,所以 xs |> List.map ~f:g 会把整个部分应用的结果再应用到 xs。

例子

utop
let concat ?sep x y =
  let sep =
    match sep with
    | None -> ""
    | Some s -> s
  in
  x ^ sep ^ y
val concat : ?sep:string -> string -> string -> string = <fun>
concat "OCaml" "书"
- : string = "OCaml书"
concat ~sep:" · " "OCaml" "书"
- : string = "OCaml · 书"
let shout xs =
  xs |> List.map ~f:String.uppercase
val shout : string list -> string list = <fun>
shout ["hi"; "ocaml"]
- : string list = ["HI"; "OCAML"]

改一改

改完再跑

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

先预测,再对照

1 / 2

concat "a" "b" 时,函数体内的 sep 一开始是?

2 / 2

xs |> f 等价于?