Ocaml编译列表理解

Ocaml编译列表理解,ocaml,list-comprehension,Ocaml,List Comprehension,我想使用ocamlopt编译列表理解。我不想使用任何特殊的库,因为ocaml至少在顶层(交互)支持列表理解 Marko Tunjic发布: 列表理解已经包含在标准ocaml中 #require "camlp4.listcomprehension";; [ x * x | x <- [ 1;2;3;4;5] ];; - : int list = [1; 4; 9; 16; 25] 文件lc1.ml包含 open Camlp4.ListComprehensions let _ = [

我想使用ocamlopt编译列表理解。我不想使用任何特殊的库,因为ocaml至少在顶层(交互)支持列表理解

Marko Tunjic发布:

列表理解已经包含在标准ocaml中

#require "camlp4.listcomprehension";;

[ x * x | x <- [ 1;2;3;4;5] ];;

- : int list = [1; 4; 9; 16; 25]
文件lc1.ml包含

open Camlp4.ListComprehensions

let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ];;
预期结果
首先是免责声明。Camlp4已被弃用,因此我强烈反对在任何新项目中使用它。考虑使用PPX,或者如果你真的需要PPX无法提供给你的东西,那么CAMLP5仍然为你服务。 要构建以非标准OCaml语法编写的程序,您需要明确告诉
ocamlfind
您正在使用的语法,例如
-syntax camlp4o
。这类似于您使用的
topfind
实用程序的
#camlp4o
指令

接下来,您不需要打开任何东西(OCaml中的
open
语句只是使用打开的模块中的定义扩展了当前名称空间)。没有像Camlp4.ListEncriptions这样的模块,因此,您的程序的正确版本是

let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ]

列表理解的顶级交互使用在ocaml 4.09.0上不起作用:opam安装camlp4无法满足以下依赖关系:-camlp4→ ocaml<4.09此开关的底座(使用“--unlock base”强制)-camlp4→ ocaml变体(=4.02.0+模隐式&=4.02.1+模隐式)不匹配的版本列表理解实际上不是ocaml语言的一部分,就像在F#中一样。因此将避免ocaml列表理解。是的,它不是语言的一部分,而且camlp4已被弃用,不再发布或维护。事实上,忽略OCaml中的列表理解是一个很好的解决方案。
ocamlfind ocamlopt -package camlp4 -linkpkg lc1.ml -o lc1

File "lc1.ml", line 3, characters 16-17:
Error: Syntax error
[10; 11; 12; 13; 14; 20; 22; 24; 26; 28; 30; 33; 36; 39; 42; 40; 44;      48; 52;
 56; 50; 55; 60; 65; 70]
let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ]
ocamlfind ocamlopt -syntax camlp4o -package camlp4.listcomprehension -linkpkg lc1.ml -o lc1