以来自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>
有什么理由拒绝第一个电话吗?
答案 0 :(得分:1)
带有标签参数的函数的类型取决于标签及其出现的顺序。调用此类函数时,您提供的参数顺序具有灵活性。实际上,如果提供所有参数,则可以省略标签。
但是,当传递诸如值本身之类的函数时,则没有这种灵活性。您只有一种标签类型可以使用。
这在Real World OCaml的第42页中进行了介绍:高阶功能和标签。
(如果您问的是为什么,我只能假设如果允许这种灵活性,类型检查就变得困难或不可能。)