首页 > 解决方案 > 在一个独立的 ocaml 程序中断言

问题描述

阅读了这个线程后,我将这段代码放入了我的.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)

标签: ocamlassertion

解决方案


阅读 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 = 0。左结合运算符,请参阅Ocaml_operators了解更多信息。

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

请注意,与两个长度为n=的长列表进行比较的时间复杂度O(n)。而是 恒定的时间。对于有数千个不同元素的列表。==

作为练习,编写与=for 列表等效的代码(例如,仅使用letrec,match==)。


推荐阅读