如何在OCaml中使用可选参数来修改函数

Pte*_*mys 5 ocaml currying

假设一个函数bind有一个带标签的参数,可选参数和未标记的参数,并且你想要定义一个m应用未标记参数的方法bind并返回部分应用的函数,以便用户m可以应用标记或可选参数bind.你怎么做到这一点?简单编写method m = bind a b [...] z会导致编译器认为省略了可选参数.

gas*_*che 11

可选参数的位置(在函数声明或函数类型中)很重要:它们仅在应用下一个非可选参数时隐式应用.

如果希望部分应用一个参数p不应用可选参数?o,请在函数声明中输入?oafter p.

对比

# let f ?o p ~z = ();;
val f : ?o:'a -> 'b -> z:'c -> unit = <fun>
# f 1;;
- : z:'_a -> unit = <fun>  (* ?o applied *)
Run Code Online (Sandbox Code Playgroud)

有:

# let f p ?o ~z = ();;
val f : 'a -> ?o:'b -> z:'c -> unit = <fun>
# f 1;;
- : ?o:'_a -> z:'_b -> unit = <fun> (* ?o not applied *)
Run Code Online (Sandbox Code Playgroud)

如果您不想更改定义顺序,或者想要部分应用所有非可选参数,则需要显式捕获将隐式传递的可选参数:

# (fun ?o () -> f ?o 1 ~z:2);;
- : ?o:'a -> unit -> unit = <fun>
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉它,那么?o调用站点的语法非常方便:它需要一个'a option正确的事情来透明地将可选参数(无论是否应用)传递给被调用者.

我添加了一个最后一个()参数来保留属性,即在可选参数之后至少有一个非可选参数.有可能不这样做,但它变得棘手,不建议.