如何在OCaml中curry函数及其可选参数

如何在OCaml中curry函数及其可选参数,ocaml,currying,Ocaml,Currying,假设一个函数bind有一个带标签的参数、可选参数和未标记的参数,并且您想定义一个方法m,该方法应用bind的未标记参数并返回部分应用的函数,因此m的用户可以应用bind的带标签或可选参数。你是怎么做到的?简单地编写方法m=bind a b[…]z会导致编译器认为可选参数被忽略。可选参数(在函数声明或函数类型中)的位置很重要:它们仅在应用下一个非可选参数时隐式应用 如果希望一个参数p的部分应用不应用可选参数?o,请将?o放在函数声明的p之后 对比度 # let f ?o p ~z = ();; v

假设一个函数
bind
有一个带标签的参数、可选参数和未标记的参数,并且您想定义一个方法
m
,该方法应用
bind
的未标记参数并返回部分应用的函数,因此
m
的用户可以应用
bind
的带标签或可选参数。你是怎么做到的?简单地编写
方法m=bind a b[…]z
会导致编译器认为可选参数被忽略。

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

如果希望一个参数
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 *)
#设f?op~z=();;
值f:?o:'a->'b->z:'c->单位=
#f1;;
-:z:“\u a->单位=(*?o应用*)
与:

#设fp?o~z=();;
val f:'a->?o:'b->z:'c->单位=
#f1;;
-:?o:''a->z:''b->单位=(*?o未应用*)
如果不希望更改定义顺序,或希望部分更改 如果应用所有非可选参数,则需要显式捕获 将隐式传递的可选参数:

# (fun ?o () -> f ?o 1 ~z:2);;
- : ?o:'a -> unit -> unit = <fun>
#(fun?o()->f?o 1~z:2);;
-:?o:'a->unit->unit=
如果您不熟悉,调用站点的
?o
语法是 这非常方便:它需要一个
'a选项
,并且做正确的事情 透明地将可选参数(无论是否应用)传递给 卡利

我添加了最后一个
()
参数,以保留其中的属性
在可选参数之后至少有一个非可选参数。不这样做是可能的,但它会变得棘手,而且不建议这样做。

在最后一段中,即使在方法定义中,最后一个()参数也是必需的吗?当然,它从来都不是强制性的,但您将得到警告,并且没有任何方法隐式地触发它(因为您无法为此“传递下一个非可选参数”),因此,它将类似于类型为
option
的非可选参数。
# (fun ?o () -> f ?o 1 ~z:2);;
- : ?o:'a -> unit -> unit = <fun>