我正在玩OCaml.我想知道如何做的第一件事是建立一个OCaml项目.现在,我只是想要一些简单的东西,因为我刚学习.任何人都可以指向构建系统以及使用该构建系统的"hello world"类型示例吗?
是否有一个替代版本std::find_if返回所有找到的元素的迭代器,而不仅仅是第一个?
例:
bool IsOdd (int i) {
return ((i % 2) == 1);
}
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
std::vector<int>::iterator it = find_if(v.begin(), v.end(), IsOdd);
for(; it != v.end(); ++it) {
std::cout << "odd: " << *it << std::endl;
}
Run Code Online (Sandbox Code Playgroud) 参考链接如何在OCaml中工作?
例如,假设我有3个模块声明为
A.mlB.mlC.ml其中
A需要B和CB 需求 A我该如何进行编译?
由于订单是相关的,ocamlc或者ocamlopt我如何修复B和之间的交叉参考A?
我想首先他们都汇编成.cmo用ocamlc -c,然后链接所有的人都在一起,但自从与交换参数将刚刚从一个模块移动到另一个问题没有成功.
具体错误是:
错误:链接A.cmo时出错:引用未定义的全局`B'
(或者反之,如果我交换了args的顺序)
我认为这是一个简单的问题,但我无法解决它...提前感谢
我正在尝试在 linux (Ubuntu) 上安装GODI。它是 ocaml 语言的库管理工具。我之前实际上已经安装了这个——两次,但不久前——没有问题——我记得——但这次我无法弄清楚我错过了什么。
$ ./bootstrap --prefix /home/nlucaroni/godi
$ ./bootstrap_stage2
.: 1: godi_confdir: not found
Error: Command fails with code 2: /bin/sh
Failure!
Run Code Online (Sandbox Code Playgroud)
我已将正确的目录添加到路径中,它们显示为一个 quick echo $path,并godi_confdir报告为:
/home/nlucaroni/godi/etc
Run Code Online (Sandbox Code Playgroud)
(...并且该目录存在,并且存在 godi.conf 文件)。所以,我无法弄清楚为什么./bootstrap_stage2不起作用。
有没有办法在OCaml中进行C风格的前向声明?
我的问题是我有两个互相引用的变体:
type path_formula =
[ `Next of state_formula
| `Until of (state_formula * state_formula)
| `UntilB of (state_formula * int * state_formula)
]
type state_formula =
[ `True | `False
| `Not of state_formula
| `And of (state_formula * state_formula)
| `Or of (state_formula * state_formula)
| `Imply of (state_formula * state_formula)
| `Label of string
| `Prob` of (boundf * path_formula)
| `Expc` of (boundi * formula)
]
Run Code Online (Sandbox Code Playgroud)
所以这两种类型都必须知道另一种类型..我在Google上搜索它但不幸的是OCaml不是那么广泛使用的编程语言.
我希望能够获得给定OCaml程序的AST(例如,我想走AST并生成代码的检测版本或进行某种转换).任何OCaml工具都支持此功能吗?
为什么这样可以正常工作?
module Account = struct
type account_type = Current of float | Savings of float
end
let sarah = Account.Current 100.0;;
Run Code Online (Sandbox Code Playgroud)
虽然下面的最后一行产生了Error: syntax error?
module Account = struct
type 'a account_type = [> `Current of float | `Savings of float ] as 'a
end
let pete = Account.`Current 100.0;;
Run Code Online (Sandbox Code Playgroud)
也就是说,为什么我不能在不打开模块的情况下在模块外部使用open union类型?我应该说我发现将最后一行更改为:
open Account;;
let pete = `Current 100.0;;
Run Code Online (Sandbox Code Playgroud)
工作正常,但显然这很麻烦,如果我account_type经常使用,或者我必须Account在使用的任何代码部分的开头打开account_type,这意味着我牺牲了我通过使用签名获得的抽象Account
我'已经浏览了几个OCaml教程以及INRIA文档,我找不到你如何做到这一点.
是否有可能避免每次我想使用时都打开模块account_type?
提前致谢,
扎克
1)我有一个开放的联合定义如下:
type 'a choice = [> `One | `Other ] as 'a
Run Code Online (Sandbox Code Playgroud)
然后我尝试定义一个类型choice_list:
type choice_list = choice list
Run Code Online (Sandbox Code Playgroud)
这不起作用.如何定义一个或多个组件是开放联合的类型?
2)如果我放弃创建choice_list类型,只需使用a choice list,当我尝试使用选择列表编写接口/签名语句时,
val choice_handler : choice list -> int
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说type 'a choice = 'a constraint 'a = [> `One | `Other ] is not included in type infection_state. They have different arities.
我的问题是,如何在接口/签名中编写选择列表的类型声明.
我可以通过以下代码找到列表的最后一个元素.
let last (xs:'a list) : 'a =
let rec aux xs prev =
match xs with
| [] -> prev
| x::ys -> aux ys x in
match xs with
| [] -> failwith "no element"
| x::xs -> aux xs x
Run Code Online (Sandbox Code Playgroud)
如何使用List.fold_leftOCaml中的函数找到同一列表的最后一个元素?提前致谢!