我定义了一个自定义相等运算符(定义并不重要,所以我将插入虚拟东西):
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.
这似乎是运营商的一个普遍问题~.我的问题是为什么我不能使用这样的运算符中缀?~符号有什么特别之处吗?
注意:我已经通过了文档,但我找不到任何相关的内容.也许我错过了什么?
我想测试一个带有一组边缘情况和正常值的元组的函数.例如,在测试一个函数,该函数true在给定三个形成有效三角形的长度时返回,我将具有特定情况,负数/小数/大数,接近溢出的值等等; 更重要的是,主要目的是生成这些值的组合,有或没有重复,以获得一组测试数据.
(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...
Run Code Online (Sandbox Code Playgroud)
作为一个注释:我实际上知道答案,但它可能对其他人有帮助,对这里的人们来说是一个挑战! - 稍后会发布我的回答.
我对仿函数有一点问题(它是结果类型).下面,我有一个使用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.elt是Set(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) 今天早上我发现我的同事在mercurial中的两个分支之间合并了错误的方式 - 我们有一个ver5和ver6分支,以及ver6中的额外文件.是否有任何方法(可能是服务器端钩子)强制任何ver5节点的子节点来自ver5?
我最近决定在我的项目目录中组织文件.我将我拥有的几种不同文件类型的解析器移动到他们自己的目录中,并决定使用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中定义函数之前声明一个函数?我正在使用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
当人们在OCaml中引用"修订语法"时,它们是否意味着这将成为该语言的新语法,还是仅仅是在CamlP4中创建的替代语法?如果是前者,那么"修订后的语法"什么时候成为OCaml的"官方语法"?
我是一个OCaml新手与一些非常复杂的(至少对我来说)OCaml代码一起工作,我没有写.如果我能看到某些值的推断类型,那么理解它会有很多帮助,因为我可以通过将鼠标悬停在任何值上来对F#和Visual Studio进行操作,例如:

(截图来自http://theburningmonk.com/2010/01/learning-f-part-1/)
我想我可以分解代码并将其提供给顶层来获取类型,但还有其他更简单的方法吗?
关于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.
我正在玩OCaml.我想知道如何做的第一件事是建立一个OCaml项目.现在,我只是想要一些简单的东西,因为我刚学习.任何人都可以指向构建系统以及使用该构建系统的"hello world"类型示例吗?
ocaml ×8
ocamlbuild ×2
branch ×1
build-system ×1
camlp4 ×1
compilation ×1
field ×1
function ×1
functor ×1
mercurial ×1
merge ×1
operators ×1
records ×1
syntax ×1
testing ×1
types ×1
unit-testing ×1