如何咖喱一个功能w.r.t.它在OCaml中的可选参数

时间:2012-03-10 14:44:53

标签: ocaml currying

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

1 个答案:

答案 0 :(得分:11)

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

如果您希望部分应用一个参数p而不应用可选参数?o,请在?o之后将p放在函数声明中。

对比度

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

使用:

# 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 *)

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

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

如果您不熟悉它,呼叫站点的?o语法是 非常方便:它需要一个'a option并做正确的事情 透明地传递一个可选参数,无论是否应用于 被叫方。

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