首页 > 解决方案 > Ocaml 编译列表推导

问题描述

我想使用 ocamlopt 来编译列表推导。我不想使用任何特殊的库,因为 ocaml 至少在顶级(交互式)级别支持列表推导。

Marko Tunjic 发布:

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

#require "camlp4.listcomprehension";;

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

- : int list = [1; 4; 9; 16; 25]

在 ocaml 4.07.1 上,我发现交互式需要以下内容:

#use "topfind";;
#camlp4o;;
#require "camlp4.listcomprehension";;

文件 lc1.ml 包含

open Camlp4.ListComprehensions

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

编译

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]

标签: ocamllist-comprehension

解决方案


首先是免责声明。Camlp4 已被弃用,因此我强烈反对在任何新项目中使用它。考虑使用 ppx,或者如果您确实需要 ppx 无法提供给您的东西,那么camlp5 仍然为您服务。

要构建以非标准 OCaml 语法编写的程序,您需要明确说明ocamlfind您正在使用哪种语法,例如-syntax camlp4o. 这类似于您使用的实用程序的#camlp4o指令。topfind

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

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

推荐阅读