假设函数bind
具有带标签的参数,可选参数和未标记的参数,并且您希望定义应用m
的未标记参数并返回部分应用的方法bind
函数,以便m
的用户可以应用bind
的标记或可选参数。你怎么做到这一点?简单地编写method m = bind a b [...] z
会导致编译器认为省略了可选参数。
答案 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
并做正确的事情
透明地传递一个可选参数,无论是否应用于
被叫方。
我添加了最后一个()
参数来保存那里的属性
在可选参数之后至少有一个非可选参数。有可能不这样做,但它变得棘手,不建议。