在Jason Hickey阅读这本书的时候

时间:2013-09-27 00:46:09

标签: ocaml

对于最终规则,高阶函数的显式注释,请考虑以下函数的定义。

# 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

有人能帮忙吗?

1 个答案:

答案 0 :(得分:1)

请改为使用?语法。

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

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

let apply (g : ?x:int -> int -> int) = ...