小编nlu*_*oni的帖子

OCaml:为什么我不能使用这个运算符中缀?

我定义了一个自定义相等运算符(定义并不重要,所以我将插入虚拟东西):

let ( ~=~ ) a b = true
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用它中缀:

if a ~=~ b then 1 else 2
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:This expression is not a function; it cannot be applied.

我可以通过将操作符重命名~=~=~或通过将其作为函数调用来解决此问题:if (~=~) a b then 1 else 2.

这似乎是运营商的一个普遍问题~.我的问题是为什么我不能使用这样的运算符中缀?~符号有什么特别之处吗?

注意:我已经通过了文档,但我找不到任何相关的内容.也许我错过了什么?

ocaml operators

23
推荐指数
2
解决办法
6987
查看次数

如何使用集合的组合作为测试数据

我想测试一个带有一组边缘情况和正常值的元组的函数.例如,在测试一个函数,该函数true在给定三个形成有效三角形的长度时返回,我将具有特定情况,负数/小数/大数,接近溢出的值等等; 更重要的是,主要目的是生成这些值的组合,没有重复,以获得一组测试数据.

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...
Run Code Online (Sandbox Code Playgroud)

作为一个注释:我实际上知道答案,但它可能对其他人有帮助,对这里的人们来说是一个挑战! - 稍后会发布我的回答.

language-agnostic testing unit-testing

21
推荐指数
1
解决办法
8851
查看次数

Ocaml的玩家

我对仿函数有一点问题(它是结果类型).下面,我有一个使用Ordered类型的Set仿函数.我实际使用的set.ml自带的OCaml的一些指导,但我似乎做的一切ahhem权.我创建了一个带有整数的Ordered模块,并将其应用于Set仿函数,以获取此代码示例IntSet的最后一个模块.

当我尝试插入一个整数时,下一行失败了.我收到以下类型错误:

Error: This expression has type int but is here used with type
         SetInt.elt = Set(OrdInt).elt
Run Code Online (Sandbox Code Playgroud)

别误会我的意思,这里的类型系统是正确的.顶级报告的类型SetInt.eltSet(OrdInt).elt,但是当我使用ocaml提供的相同操作设置Set时,'same'行是,SetInt.elt = OrderedInt.t.好像我应该得到SetInt.elt = Ordered.t.

这很简单,我可能只是错过了一些愚蠢的细节!哎呀!

请注意:我已经简化了成员/插入函数,因为这个问题与类型有关.

module type Ordered =
  sig
    type t 
    val lt : t -> t -> bool
    val eq : t -> t -> bool
    val leq : t -> t -> bool
  end

module type S =
  sig
    type elt
    type t
    exception Already_Exists
    val …
Run Code Online (Sandbox Code Playgroud)

ocaml functional-programming functor

12
推荐指数
1
解决办法
2462
查看次数

确保分支之间的合并发生在一个方向上

今天早上我发现我的同事在mercurial中的两个分支之间合并了错误的方式 - 我们有一个ver5和ver6分支,以及ver6中的额外文件.是否有任何方法(可能是服务器端钩子)强制任何ver5节点的子节点来自ver5?

version-control merge mercurial branch

11
推荐指数
1
解决办法
455
查看次数

正确编译子文件夹中的模块(ocamlbuild)

我最近决定在我的项目目录中组织文件.我将我拥有的几种不同文件类型的解析器移动到他们自己的目录中,并决定使用ocamlbuild(因为项目变得越来越复杂,简单的shell脚本不再足够).

我可以用一些基本的规则(修改调用成功myocamlbuild包括外部项目ocaml_lib,我会用ocamlfind其他时间),但我停留在如何将文件夹作为一个模块到项目正常.我创建了一个parser.mlpack文件并填入了要包含的适当模块(例如,"parser/Date"等等),parser.mli在目录的根目录中为它们的实现编写了一个_tags文件,并修改了文件(见下文).

在编译,解析器目录遍历正确的,并且parser.cmi,parser.mli.depends在双双创建_build目录; 以及*.cm[xio]解析器子目录中的所有文件.

我觉得我可能会做一些多余的事情,但无论如何,当我编译时,项目仍然无法找到Parser模块!

谢谢!

_tags

debug : true
<*.ml> : annot
"parser" : include
<parser/*.cmx>: for-pack(Parser)
<curlIO.*> : use_curl
<mySQL.*> : use_mysql
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql
Run Code Online (Sandbox Code Playgroud)

编译错误

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native  
File "\_none\_", line 1, characters 0-1:  
Error: **No implementations provided for the …
Run Code Online (Sandbox Code Playgroud)

ocaml compilation ocamlbuild

10
推荐指数
1
解决办法
2141
查看次数

OCaml:在定义函数之前声明它

有没有办法在OCaml中定义函数之前声明一个函数?我正在使用OCaml解释器.

我有两个功能:

let myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *)

let myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为myFunctionA在制作之前无法调用myFunctionB.

我做了一些谷歌搜索,但似乎找不到任何东西.我怎么能做到这一点?

ocaml functional-programming function mutual-recursion function-declaration

10
推荐指数
1
解决办法
4909
查看次数

OCaml中的"修订语法"是什么?

当人们在OCaml中引用"修订语法"时,它们是否意味着这将成为该语言的新语法,还是仅仅是在CamlP4中创建的替代语法?如果是前者,那么"修订后的语法"什么时候成为OCaml的"官方语法"?

ocaml camlp4

9
推荐指数
1
解决办法
1175
查看次数

请参阅复杂OCaml代码中的推断类型

我是一个OCaml新手与一些非常复杂的(至少对我来说)OCaml代码一起工作,我没有写.如果我能看到某些值的推断类型,那么理解它会有很多帮助,因为我可以通过将鼠标悬停在任何值上来对F#和Visual Studio进行操作,例如:

F#显示推断类型

(截图来自http://theburningmonk.com/2010/01/learning-f-part-1/)

我想我可以分解代码并将其提供给顶层来获取类型,但还有其他更简单的方法吗?

ocaml types type-inference

9
推荐指数
2
解决办法
825
查看次数

复制OCaml中的字段

关于OCaml记录,我有一个非常基本的问题.假设我有一个定义的记录:

type r = {a:int;b:int;c:int}
let x = {a=3;b=8;c=2}
Run Code Online (Sandbox Code Playgroud)

现在,假设我想要创建一个记录,其中所有字段都等于x但c = 4.我可以写:

let y = {a=3;b=8;c=4}
Run Code Online (Sandbox Code Playgroud)

但这很烦人,因为不需要重写a = 3和b = 8.我也可以写:

let y = {a=x.a;b=x.b;c=4}
Run Code Online (Sandbox Code Playgroud)

但如果记录有很多字段,这仍然不好.有没有办法写一些像:

let y = {x with c=4}
Run Code Online (Sandbox Code Playgroud)

或类似的东西?

非常感谢您的帮助.

一切顺利,Surikator.

syntax ocaml records field

7
推荐指数
1
解决办法
1157
查看次数

编译OCaml项目的简单方法是什么?

我正在玩OCaml.我想知道如何做的第一件事是建立一个OCaml项目.现在,我只是想要一些简单的东西,因为我刚学习.任何人都可以指向构建系统以及使用该构建系统的"hello world"类型示例吗?

compiler-construction ocaml build-system ocamlbuild

6
推荐指数
2
解决办法
2446
查看次数