15

現在、「Real Word OCaml」を使用していますが、名前付き/ラベル付きパラメーターを使用した基本的な例の 1 つが機能していないようです (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

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 に答える