OCaml中高阶函数和带标签的参数的行为解释

时间:2018-11-03 14:46:34

标签: ocaml higher-order-functions named

以来自RWOCaml的示例为例:

utop # let divide ~first ~second = first / second;;
val divide : first:int -> second:int -> int = <fun>

utop # let apply_to_tuple_3 f (first,second) = f second first;;
val apply_to_tuple_3 : ('a -> 'b -> 'c) -> 'b * 'a -> 'c = <fun>

utop # apply_to_tuple_3 divide;;
Error: This expression has type first:int -> second:int -> int
       but an expression was expected of type 'a -> 'b -> 'c

在这里不匹配类型有意义吗? apply_to_tuple_3仅使用divide当然拥有的位置参数。

删除姓名后,申请被接受

utop # let divide_an x y = divide x y;;
val divide_an : int -> int -> int = <fun>
utop # apply_to_tuple_3 divide_an;;
- : int * int -> int = <fun>

有什么理由拒绝第一个电话吗?

1 个答案:

答案 0 :(得分:1)

带有标签参数的函数的类型取决于标签及其出现的顺序。调用此类函数时,您提供的参数顺序具有灵活性。实际上,如果提供所有参数,则可以省略标签。

但是,当传递诸如值本身之类的函数时,则没有这种灵活性。您只有一种标签类型可以使用。

这在Real World OCaml的第42页中进行了介绍:高阶功能和标签

(如果您问的是为什么,我只能假设如果允许这种灵活性,类型检查就变得困难或不可能。)