Ocaml &引用;错误:应用于此参数的函数的类型为…“;使用命名参数时

Ocaml &引用;错误:应用于此参数的函数的类型为…“;使用命名参数时,ocaml,named-parameters,utop,Ocaml,Named Parameters,Utop,我目前正在使用“Real Word OCaml”,其中一个带有命名/标记参数的基本示例似乎不起作用(使用utop 4.01.0): 产生: Error: The function applied to this argument has type 'a list -> 'b list This argument cannot be applied with label ~f 鉴于: List.map String.length languages;; 生成预期的输出[5;4;1] 提到

我目前正在使用“Real Word OCaml”,其中一个带有命名/标记参数的基本示例似乎不起作用(使用utop 4.01.0):

产生:

Error: The function applied to this argument has type 'a list -> 'b list
This argument cannot be applied with label ~f
鉴于:

List.map String.length languages;;
生成预期的输出
[5;4;1]

提到:

与大多数语言一样,在核心语言中,参数是匿名的

这是否意味着我必须包含某种外部库才能使代码正常工作

编辑 这是我的
~/.ocamlinit
文件(根据):


未使用标签~f定义标准List.map方法。List.map的类型是('a->'b)->'a List->'b List,但是如果要使用“~f”标签,它必须是“f:('a->'b)->'a List->'b List”。如果您想定义自己的,您必须将其定义为:

 let rec myMap ~f l = match l with
 | [] -> []
 | h::t -> (f h) :: (myMap ~f t);;

 val myMap : f:('a -> 'b) -> 'a list -> 'b list = <fun>

干杯

正如@rafix评论中提到的,这可以通过

open Core.Std ;;

首先。

我希望使这个示例工作所需的库是Core(如上所列的“OCaml标准库的工业实力替代品”)。这本书没有提到先安装它吗?据我所知,我已经正确安装了内核;查看我的更新答案。您是否放置了“opencore.Std;”“第一个?”拉菲克斯说,这就成功了。如果你加上这个作为答案,我很乐意接受。+1我不想定义我自己的映射函数,但知道如何使用带标签的参数肯定很有用:-)没有lambda?为什么必须使用标签?在较新版本中,
Core.Std
是不受限制的。使用
opencore取而代之。
 let rec myMap ~f l = match l with
 | [] -> []
 | h::t -> (f h) :: (myMap ~f t);;

 val myMap : f:('a -> 'b) -> 'a list -> 'b list = <fun>
 myMap ~f:String.length languages
open Core.Std ;;