我注意到,在我知道的OCaml程序员中,他们中的一些总是使用多态变体(未声明的变体,以反引号为前缀),而其他变体从不使用多态变体,而更喜欢在类型中声明的变体.
除了性能原因(多态变体目前编译效率低于简单变体),专家OCaml开发人员如何在它们之间进行选择?
我想向初学者宣传OCaml,我正在寻找英语的好教程; 不仅仅是你听说过,而是你实际上已经尝试并发现有用......
在Leroy关于如何在OCaml中输入递归模块的论文中,编写了在模块类型近似的环境中检查模块:
module rec A = ... and B = ... and C = ...
Run Code Online (Sandbox Code Playgroud)
环境{A - >约(A); B - >约(B); 首先构建C - > approx(C)},然后用于计算A,B和C的类型.
我注意到,在某些情况下,近似值不够好,并且类型检查失败.特别是,当将编译单元源放在递归模块定义中时,类型检查可能会失败,而编译器则能够单独编译编译单元.
回到我的第一个例子,我发现一个解决方案是在初始近似环境中输入A,然后在新的计算类型A扩展的初始环境中输入B,并在前一个环境中输入C新计算的B类型,依此类推.
在进一步研究之前,我想知道是否有关于此主题的任何先前工作,表明这种递归模块的编译方案是安全还是不安全?是否有反例显示使用此方案正确键入的不安全程序?
ocaml programming-languages functional-programming module strong-typing
- 关于交互式顶层和图形UI编程的几个问题:
是否可以从ocaml toplevel动态构建图形界面?
也可以使用图形库吗?
我有一个关于编码实践的一般问题......
在调试时,在我的代码的某些时候,我需要一些代码来打印当前状态; 当我不调试时,我不想将代码保留在那里,因为它阻碍了其他代码的可见性......
很难将它们打包成一个函数,因为大多数时候,它涉及局部变量,我不想将所有内容作为参数传递...
那么你如何管理这种"打印/检查"代码呢?有什么好的做法吗?
我正在尝试使用堆栈跟踪Printexc.get_backtrace,但我收到错误:
(Program not linked with -g, cannot print stack backtrace)
我正在编译:
ocamlfind ocamlc -g -o foo ... $(FOO_OBJS)
FOO_OBJS编译为:
ocamlc -c $OBJ
怎么了?应该每个.cmo都编译-g?
如果在没有编译的对象中发生异常,-g我会得到部分堆栈跟踪,或者根本没有堆栈跟踪?
debugging ocaml functional-programming compilation exception
let find_free_next heap start =
for i = start to ((Array.length heap)-1) do
match heap.(i) with
Hdr (Free (h), g) ->
i
done
Run Code Online (Sandbox Code Playgroud)
一旦找到匹配,我怎样才能将循环的索引作为整数返回?
理想情况下,除了OCaml之外,该库还支持多种语言,但对OCaml的良好支持是主要要求.
现在,我有一个用OCaml编写的工作HTML模板系统.一般设计是单个模板是应用于以下模块类型的仿函数返回的模块:
module type TEMPLATE_DEF = sig
type t (* The type of the data rendered by the template. *)
val source : string (* Where the HTML template itself resides. *)
val mapping : (string * (t -> string)) list
end
Run Code Online (Sandbox Code Playgroud)
例如,呈现博客帖子将基于此:
module Post = Loader.Html(struct
type t = < body : string ; title : string >
let source = ...
let mapping = [ "body", (fun x -> x#body) ; "title", (fun x -> x#title) ]
end)
Run Code Online (Sandbox Code Playgroud)
仅具有 …
刚买了一台新的Mac,Mountain Lion,我希望能够设置所有与ocaml相关的东西.
我使用了以下命令:
opam switch 4.00.1
opam install findlib
opam install batteries
Run Code Online (Sandbox Code Playgroud)
所有都安装成功,没有错误.
但我不能用batteries,bisect等我总是会说package can't be found.
任何的想法?
我应该设置什么path或什么?
编辑:
有关更多信息,我按照以下步骤操作:
1. install homebrew
http://mxcl.github.com/homebrew/
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
2. Emacs for Mac OS X
http://emacsformacosx.com/
3. Install tuareg-mode
http://forge.ocamlcore.org/forum/forum.php?forum_id=808
http://marmalade-repo.org/
Add to your .emacs: (require 'package) (in home directory)
(add-to-list 'package-archives
'("marmalade" .
"http://marmalade-repo.org/packages/"))
(package-initialize)
M-x eval-buffer to evaluate it, and then do M-x package-refresh-contents to load in the package …Run Code Online (Sandbox Code Playgroud) 安装camlbz2时出错
%opam安装camlbz2
...
...
. checking bzlib.h usability... no
. checking bzlib.h presence... no
. checking for bzlib.h... no
Run Code Online (Sandbox Code Playgroud)
awk:第1行:正则表达式编译失败(语法错误^*或^ +)^ + configure:错误:找不到'opam install camlbz2'失败.我找不到任何东西为opam安装类似"libbz2"或其他什么,任何建议?
有什么区别
if mi.(j) = false && m.(j).(i) = false
Run Code Online (Sandbox Code Playgroud)
和
if not (mi.(j) && m.(j).(i))
Run Code Online (Sandbox Code Playgroud)
因为我认为它具有相同的含义,但是当我运行代码时,它给了我一个不同的答案.