在一个独立的ocaml程序中断言。

问题描述 投票:0回答:1

阅读了 这条 我把这段代码放到了我的 .ml 文件。

let x = [3;5;9]
(* Testing append to the list *)
let () = assert( x @ [2;10] == [3;5;9;2;10])

并运行

$ ocamlc -o BasicList BasicList.ml  && ./BasicList 
Fatal error: exception Assert_failure("BasicList.ml", 3, 9)
  • 为什么会出现这个错误?
  • 有没有其他有效或好的方法来测试我的功能?我看的大多数教科书都是在REPL中演示的。我是Ocaml的新手,所以很想听听你的经验。
ocaml
1个回答
2
投票

阅读 文件 的Ocaml。

最近 Stdlib,你可能想使用 = 结构平等运算符和代码

 assert( x @ [2;10] = [3;5;9;2;10])

请注意 == 是编码的 身体平等 操作符(指针,更准确的说是物理盒装值)。

val (==) : 'a -> 'a -> bool

e1 == e2 测试e1和e2的物理平等。在可变类型上,如引用、数组、字节序列、具有可变字段的记录和具有可变实例变量的对象,如果且仅当e1的物理修改也会影响e2时,e1 == e2为真。在不可变类型上,e1==e2的行为是真。( == ) 是依赖于实现的。 然而,它保证e1 == e2意味着比较e1 e2 = 0。 左联运算符,参见 Ocaml_operators 以获取更多信息。

顺便说一下 ocaml 编程语言 一个 开源 实现。你应该考虑研究它的源代码。

要知道,与 = 两张长长的单子 n 拥有 时间复杂度O(n). 但是... == 是恒定的时间。对于成千上万个元素的列表来说,这是有区别的。

作为一个练习,请为相当于 = 列表(例如,只使用一个 letrec, match==).

© www.soinside.com 2019 - 2024. All rights reserved.