对于最终规则,高阶函数的显式注释,请考虑以下函数的定义。
# 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
有人能帮忙吗?
答案 0 :(得分:1)
请改为使用?
语法。
let apply g = g ?x:(Some 1) 2 + 3
另一种合理的方法是给g
一个类型签名。
let apply (g : ?x:int -> int -> int) = ...