Types 使用Core.Std.List.fold_,不带标签

Types 使用Core.Std.List.fold_,不带标签,types,polymorphism,ocaml,type-inference,labels,Types,Polymorphism,Ocaml,Type Inference,Labels,我正在试验Core的列表。向左折叠 # List.fold_left;; - : 'a Core.Std.List.t -> init:'b -> f:('b -> 'a -> 'b) -> 'b = <fun> 但如果不指定标签,则会得到不同的结果: # List.fold_left [1;2;3] ~init:0 ~f:(+);; - : int = 6 # List.fold_left [1;2;3] 0 (

我正在试验Core的
列表。向左折叠

# List.fold_left;;
- : 'a Core.Std.List.t -> init:'b -> f:('b -> 'a -> 'b) -> 'b = <fun>
但如果不指定标签,则会得到不同的结果:

# List.fold_left [1;2;3] ~init:0 ~f:(+);;
- : int = 6                  
# List.fold_left [1;2;3] 0 (+);;
- : init:(int -> (int -> int -> int) -> '_a) ->
    f:((int -> (int -> int -> int) -> '_a) ->
       int -> int -> (int -> int -> int) -> '_a) ->
    '_a
= <fun>
#List.fold_左[1;2;3]0(+);;
-:init:(int->(int->int->int)->'\u a)->
f:((int->(int->int->int)->''uA)->
int->int->(int->int->int)->'\u a)->
"
= 
其他部分应用程序也会生成非直观类型。为什么我可以在list参数后添加任意数量的0

# List.fold_left [1;2;3] 0;;
- : init:(int -> '_a) -> f:((int -> '_a) -> int -> int -> '_a) -> '_a = <fun>

# List.fold_left [1;2;3] 0 0;;
- : init:(int -> int -> '_a) ->
    f:((int -> int -> '_a) -> int -> int -> int -> '_a) -> '_a
= <fun>
#List.fold_left[1;2;3]0;;
-:init:(int->'''uA)->f:((int->''uA)->int->int->''uA)->''uA=
#List.fold_left[1;2;3]0;;
-:init:(int->int->'\u a)->
f:((int->int->''uA)->int->int->int->''uA)->''uA
= 
其他一些函数表现出相同的行为:

# let app ~f ~x = f x;;
val app : f:('a -> 'b) -> x:'a -> 'b = <fun>

# app (fun x -> x + 1) 1;;
- : f:('a -> (int -> int) -> int -> 'b) -> x:'a -> 'b = <fun>
#让app~f~x=fx;;
val应用程序:f:('a->'b)->x:'a->'b=
#应用程序(乐趣x->x+1)1;;
-:f:('a->(int->int)->int->'b)->x:'a->'b=
但是,在应用某些带标签的函数时,如果不提供标签,则可以返回预期结果。例如:

# List.map;;
- : 'a Core.Std.List.t -> f:('a -> 'b) -> 'b Core.Std.List.t = <fun>

# List.map [1;2;3] (fun x -> x + 1);;
- : int Core.Std.List.t = [2; 3; 4]
#List.map;;
-:'a Core.Std.List.t->f:('a->'b)->'b Core.Std.List.t=
#List.map[1;2;3](乐趣x->x+1);;
-:int Core.Std.List.t=[2;3;4]
为什么有些函数在没有给定标签的情况下返回非直观的值,而其他函数则按预期工作?

根据您的说法,只有在“应用程序为total(忽略所有可选参数)”的情况下,才可以省略标签,并给出重要的警告“它的功能类似于
ListLabels。如果结果类型为类型变量,则永远不会将其视为完全应用。”


因此,由于core的
fold__left
的结果类型当然也是一个类型变量,因此您不能在没有标签的情况下调用它。当您这样做时,位置参数被解释为由
fold_left
生成的函数的参数,它仍然等待您提供标记的参数。

@sepp2k的answer清楚地解释了这里发生的事情。让我补充一件事

简单地说,不要忽略带标签函数的标签。它们是为特定目的而存在的。我相信没有人能够始终正确地处理标签忽略。您应该始终打开警告6并将其设置为错误:

$ ocamlc -w +6 -warn-error +6 file.ml
File "file.ml", line 2, characters 17-18:
Warning 6: labels were omitted in the application of this function.
File "file.ml", line 1:
Error: Some fatal warnings were triggered (1 occurrences)