15

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

let languages = ["OCaml"; "Perl"; "C"];;
List.map ~f:String.length languages;;

产生:

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]

caml.inria.fr提到:

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

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

编辑 这是我的~/.ocamlinit文件(根据本书的安装说明):

(* Added by OPAM. *)
let () =                
  try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
  with Not_found -> ()
;;

#use "topfind"
#camlp4o
#thread
#require "core.top"
#require "core.syntax" 
4

2 回答 2

12

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

open Core.Std ;;

第一的。

于 2014-06-13T07:12:55.770 回答
2

标准的 List.map 方法没有用标签 ~f 定义。List.map 的类型是 ('a -> 'b) -> 'a list -> 'b list,但如果你想使用 "~f" 标签,它必须是 "f:('a ->'b) -> 'a 列表 -> 'b 列表"。如果你想定义你自己的,你必须这样定义它:

 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

干杯!

于 2014-02-05T13:55:12.867 回答