我最近按照说明安装了OPAM,试一试它看起来不错,我想用它.但是,在我选择尝试OPAM之前,它无法检测到我手动安装的以前安装的OCAML包.
OPAM现在要为任何软件包安装做的第一件事就是安装ocamlfind.查询有关我手动安装的软件包的信息并不反映它们已经安装.这包括ocamlfind.
我害怕做任何事情,因为我不知道它可能会对安装另一个包有什么影响.OPAM至少会覆盖或重新安装ocamlfind.这会破坏我现有的ocamlfind以及我已经手动安装的所有软件包的知识以及我使用它们的能力吗?我不想再重新安装所有东西.我搜索和搜索但找不到关于这个精确主题的任何文档或论坛帖子,我不知道ocamlfind如何在幕后工作.
至少,如果OPAM可以检测或被告知哪些包已经存在以及它们驻留在哪里以避免不必要的重新编译,那将是很好的.也许它已经这样做但我无法发现它是否如此.
我是一个ocaml菜鸟.使用普通的旧的ref或int或其他简单的内置类型,到目前为止对我来说都是各方面的预期.我在元组的上下文中使用它们,其中ref是元组的成员.我可以更新refs,取消引用它们等.
# let e = 1, ref 1;;
val e : int * int ref = (1, {contents = 1})
# snd e := 2;;
- : unit = ()
# e;;
- : int * int ref = (1, {contents = 2})
# !(snd e);;
- : int = 2
Run Code Online (Sandbox Code Playgroud)
但是一旦我将一个命名类型"ref"声明为其他聚合(甚至是内置的简单)类型,事情总的来说就很糟糕了.我发现我不能再改变引用了,因为之前它们没有被声明为某种类型的"ref"类型.的!并且:=运算符失败.
语义似乎以奇怪的不一致的方式改变.以下只是一个例子.为什么编写下面的第一个代码块是合法的,但在顶部循环中执行类似的操作似乎是非法的(下面进一步说明)?第一个块被编译器接受,并且我们可以匹配一个构造类型的ref并使用!来访问它的值.第13行和第14行的运算符.这都在循环队列的上下文中,并使用#use从顶部循环中的文件加载:
type 'a element = 'a * 'a pointer
and 'a pointer = Pointer of 'a element ref;;
let next (_,n) = n;;
type 'a queue = 'a …Run Code Online (Sandbox Code Playgroud)