ocaml - 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]
解决方案
首先是免责声明。Camlp4 已被弃用,因此我强烈反对在任何新项目中使用它。考虑使用 ppx,或者如果您确实需要 ppx 无法提供给您的东西,那么camlp5 仍然为您服务。
要构建以非标准 OCaml 语法编写的程序,您需要明确说明ocamlfind
您正在使用哪种语法,例如-syntax camlp4o
. 这类似于您使用的实用程序的#camlp4o
指令。topfind
接下来,您不需要打开任何东西(open
OCaml 中的语句只是使用打开的模块中的定义扩展当前命名空间)。没有这样的模块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
推荐阅读
- ruby - 如何使用 ruby 从另一个方法调用一个方法?
- javascript - 有没有办法使用 SvelteKit 加载函数进行动态查询?
- keycloak - 从任何来源(身份提供者或用户联合)添加用户时订阅事件
- laravel - 无法将视图或路由发布到我的项目目录中
- postgresql - 尽管在列上缺少选择权,但仍删除行
- python - python中的工作功能但是我的测试仍然失败?
- python - 在 Python 中添加自开始日期以来的行
- c - 如何使scanf根据第一个字符停止从输入中读取?
- vba - 无法访问通过方法添加到自定义类中的集合的自定义对象
- javascript - 带有 try catch puppeteer 的无限循环