对于最终规则,高阶函数的显式注释,请考虑以下函数的定义 apply。
# let apply g = g ~x:1 2 + 3;;
val apply : (x:int -> int -> int) -> int = <fun>
我不明白上面的行,因此不明白以下内容:
请注意,编译器推断该函数~g
具有标记,而不是可选参数。g ~x:1
无论标签是带标签的还是可选的,语法都是一样的x
,但两者并不相同。
# apply (fun ?(x = 0) y -> x + y);; Characters 6-31:
apply (fun ?(x = 0) y -> x + y);; ^^^^^^^^^^^^^^^^^^^^^^^^^
这个函数应该有类型x:int -> int -> int
,但它的第一个参数被标记~?x
编译器总是倾向于推断一个参数是带标签的,而不是可选的。如果您想要其他行为,您可以明确指定类型。
# let apply (g : ?x:int -> int -> int) = g ~x:1 2 + 3;; val apply : (?x:int -> int -> int) -> int = <fun>
# apply (fun ?(x = 0) y -> x + y);;
- : int = 6
有没有人可以帮忙?