如何在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>