ocaml - 在一个独立的 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)
- 为什么会出现这个错误?
- 是否有另一种有效或良好实践的方法来测试我的功能?我阅读的大多数教科书仅在 REPL 中演示。我是 Ocaml 的新手,所以很高兴听到你的经验。
解决方案
阅读 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
和==
)。
推荐阅读
- flutter - 使用 BlocProvider 的 Bloc 插件问题
- java - PUT 请求的 Spring Boot 406 状态码
- reactjs - 带有材质 ui 和 Reactjs 的嵌套侧边栏菜单
- vb.net - 在vb.net中单击标题期间的datagridview日期列排序问题
- swiftui - 列表视图未在 swift UI 中更新
- html - 未使用 IMG 标记大小 attr
- java - 跨多个服务器的每个客户端的 API 命中数
- python - 如何限制从 txt 文件中读取的总字数
- powershell - 测试路径,检查文件是否存在
- angular - 时间格式,如角度 8 中的 (hh:mm)