- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我基于 ocamlbuild 的项目结构:
_tags.ml:
true: package(batteries)
Main.mlpack
Stream
主/Stream.ml
module MyStream = BatStream
我正在尝试使用编译Main
模块
ocamlbuild -use-ocamlfind Main.cmo
该错误消息对我来说似乎相当不合逻辑:
+ ocamlfind ocamlc -pack Main/Stream.cmo -o Main.cmo
File "_none_", line 1:
Error: The files Main/Stream.cmi and Main/Stream.cmi
make inconsistent assumptions over interface Stream
Command exited with code 2.
Compilation unsuccessful after building 3 targets (0 cached) in 00:00:00
这是使用 OPAM 的 OCaml 4.02.1。
这只发生在与电池链接时,所以我只能认为 Batteries.Stream
和 Main.Stream
之间存在冲突。事实上,如果我添加更多具有依赖项的模块,我可以收到类似的消息
Error: The files /home/ken/.opam/4.02.1/lib/batteries/batteries.cmi
and Main/Stream.cmi make inconsistent assumptions
over interface Stream
但是,我不希望子模块发生冲突。
为什么会发生这种情况?在我看来,模块不可能通过接口(interface)与自身发生冲突。
最佳答案
OCaml 有一个用于编译单元名称的平面命名空间。当编译单元使用某个模块时,它会记录模块接口(interface)的名称和摘要(基本上是接口(interface)的 CRC)。一致性检查确保两个同名的接口(interface)具有相同的摘要(基本上代表相同的实现)。尽管错误消息确实具有误导性,但它仍然是正确的(尽管措辞可以更好)。让我们使用 ocamlobjinfo
工具:
$ ocamlobjinfo _build/Main/Stream.cmi
File _build/Main/Stream.cmi
Unit name: Stream
Interfaces imported:
83d31bf1e61f22b62a8b2728a55f2593 Stream
d0b21ad0c1f4e93fa8c05b9ded519b52 Stream
999b28e3b7638771c87eebf5a8325e42 Pervasives
60c2e7663dd57d13b5920931742e1c10 Format
9642e3ed163e46770985ca668738ed5f CamlinternalFormatBasics
6dc691300ced97c0e319cbcc0a715044 Bytes
3bd1af04573ce2da7fc3dc04403e852e Buffer
383683999ce4d4a54f1689bb92969ecb BatStream
fbefc52bb310bf525973099141e16ffe BatOrd
92bc9ee9d7e3da3421ed7fc5c0ade74d BatInterfaces
7d12ec9e52c91f3af313796ff85158c4 BatInnerIO
6f57ab9f63c2f00619c3ffc9bde0bc80 BatIO
bd48c0243cabeabfa9ba81aa02319882 BatEnum
1972feae99a1525e1b830ca37c4efa20 BatConcurrent
我们导入了两个具有相同名称但不同实现(CRC 和不同)的接口(interface)。第一个接口(interface)实际上是您的 Stream 模块的接口(interface),第二个接口(interface)是标准 Stream 模块的接口(interface):
$ ocamlobjinfo /home/ivg/.opam/devel/lib/ocaml/stream.cmi
File /home/ivg/.opam/devel/lib/ocaml/stream.cmi
Unit name: Stream
Interfaces imported:
d0b21ad0c1f4e93fa8c05b9ded519b52 Stream
999b28e3b7638771c87eebf5a8325e42 Pervasives
9642e3ed163e46770985ca668738ed5f CamlinternalFormatBasics
您可能会注意到每个模块总是导入自己的接口(interface)。因此,冲突发生在您的 Stream
模块和 OCaml 的 Stream
模块之间。标准的 Stream
模块通过 BatStream
模块进入您的编译单元。
总结一下。接口(interface)命名空间是扁平的,因此需要使用前缀来防止冲突,参见BatStream
。是的,它很丑。
模块打包可以帮助您防止打包到包中的模块与使用该包的模块之间的名称冲突。例如,如果您有一个模块 M
打包在包 P
中,那么您可以将它与另一个模块 M
链接,并且不会有M
和 P.M
之间存在冲突(如果您所做的一切正确的话)。但是,当您构建包时,构成它的模块不应与它们使用的模块发生冲突,而且不幸的是,OCaml 标准库不是包,因此您应该选择不与标准库冲突的名称或您用于实现包的任何其他库。
关于ocaml - 单个 OCaml 模块会导致接口(interface)假设不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42049798/
一旦我看到了用C++进行某种假设的方法,例如: int x=7; assume (x==7);//if not right a red error will appear and program wi
我正在尝试测试我的数据库类。这是它的简化示例。 class Database: """ it has more methods but I show only the most important "
这只是一个思考练习,我会对任何意见感兴趣。尽管如果它有效,我可以想出一些我会使用它的方法。 传统上,如果你想对由数组或范围等形成的嵌套循环的结果执行一个函数,你会这样写: def foo(x, y)
当某些假设无效时,MSTest 是否有办法不运行测试?就像 JUnit 的“Assume.*”方法一样: //Setup Assume.assumeEquals(2, count); //Only r
为什么会出现这个警告?如果我检查边界,这并不是一个真正的假设。以及如何修复? 如果num_actions_to_skip设置为 1,而不是 2,错误消失。 谢谢 error: assuming sig
书理解和使用 C 指针 , by Richard Reese 说: The null concept is an abstraction supported by the null pointer c
所以我有两个假设,一个是 h : A -> B,另一个是 h2 : A。如何让 h3 : B 出现在我的假设中? 最佳答案 pose proof (h h2) as h3. 引入h3 : B作为新假设
我知道发生冲突的可能性很小,但如果我生成了一批 1000 个 GUID(例如),是否可以安全地假设它们都是唯一的以节省对每个 GUID 的测试? 奖励问题 测试 GUID 唯一性的最佳方法是什么?也许
这个问题已经有答案了: Jackson JSON: get node name from json-tree (5 个回答) 已关闭 7 年前。 我正在尝试迭代 JsonNode 树,并且我编写了以下
我无法弄清楚如何在 Sympy 中假设复数的正实部。Mathematica 代码示例: a = InverseFourierTransform[ R/(I omega - lambda) + Con
这个问题在这里已经有了答案: 关闭 14 年前。 重复: Do web sites really need to cater for browsers that don’t have Javascr
我使用hypothesis 已经有一段时间了。我想知道如何重用 @given parts。 我有一些大约 20 行,我将整个 @given 部分复制到几个测试用例之上。 一个简单的测试例子 @give
您好,我的 C++ 代码中有一个错误。我有 2 个 .cpp 文件和 1 个 .h 文件,我试图从头文件访问 5 个字符串和 1 个 int,但我收到一条错误消息,提示“缺少显式类型(假设为‘int’
我正在尝试使用 IAR 开发一个项目。这是错误消息:错误 [Pe260]:缺少显式类型(假定为“int”) 问候。 当我尝试:void send_data_byte(unsigned char dat
我正在处理一个数组,我想在其中添加它的一些值。在某些时候,为了仅通过一次计算即可完成此操作,它会要求数组外的索引。 有没有办法说,“如果索引在数组之外,则假定值为 0”? 有点像这样:
在 Python 2 中,我想评估一个包含文字表示的字符串。我想安全地执行此操作,所以我不想使用 eval()——相反,我已经习惯了使用 ast.literal_eval()的任务。 但是,我还想在纯
我正在对时间进行大量计算,通过添加秒数来构建相对于其他时间对象的时间对象。该代码应该在嵌入式设备和服务器上运行。大多数文档都说 time_t 是某种算术类型,通常存储自纪元以来的时间。假设 time_
我正在编写一个程序,其中大多数使用的库函数返回-1 并设置错误号。程序的行为是在发生错误时退出。要从程序外部确定确切的退出点和错误(例如使用 gdb),我想使用以下方法: err = func_1(.
这是我今天考试的一道题: 在 C 中,假设指针是严格类型化的(即,指向 int 的指针不能用于指向 char)。这会降低它的表达能力吗?如果不是,您为什么以及如何补偿此限制?如果是,如何?您还需要添加
我将星期几存储在数据库中,其中星期日 = 1,星期一 = 2 等。 在数据库查询中,我需要将日期转换为 System.DayOfWeek。 根据 MSDN : The value of the con
我是一名优秀的程序员,十分优秀!