-1

对于最终规则,高阶函数的显式注释,请考虑以下函数的定义 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

有没有人可以帮忙?

4

1 回答 1

1

请尝试使用?语法。

let apply g = g ?x:(Some 1) 2 + 3

另一种合理的方法是给出g类型签名。

let apply (g : ?x:int -> int -> int) = ...
于 2013-09-27T01:26:06.210 回答