据我所知,模块接口/签名就像Java中的接口。我有点理解为什么我得到了未绑定的构造函数错误,但我不知道该怎么做。
我有一个trie模块,这是trie.mli文件的一部分:
type ('k, 'v) trie
val empty : ('k, 'v) trie
val is_empty : ('k, 'v) trie -> bool
这是来自test.ml文件:
open OUnit
open Trie
let t () =
assert_equal (is_empty (Trie(None,[]))) true;
assert_equal (is_empty (Trie(Some 7,[]))) true
这是来自trie.ml文件:
type ('k, 'v) trie = Trie of 'v option * (('k * ('k, 'v) trie) list)
未绑定的构造函数错误来自test.ml文件。所以我理解的是接口只提供抽象模块定义,所以我不能在.ml文件中使用构造函数。所以我不确定如何测试我的实现。我会创建一个名为create或者其他东西的新函数吗?
答案 0 :(得分:4)
您可以查看测试库https://github.com/janestreet/ppx_inline_test和http://batteries.vhugot.com/qtest/,以便在Trie
模块中内联编写测试,其中类型不是抽象的。否则,是的,您必须提供一些函数来构造您想要的尝试,仅在测试期间使用,或者在接口中使类型具体化。您也可以使用trie遍历函数来测试您的尝试,而不是在测试期间手动构建示例尝试。
还有一种复杂的方法,您可以通过定义某个模块Trie
来为您的测试代码和公共提供The_real_trie
模块的两个不同视图,而不是用签名约束它(例如一个mli
文件),针对该模块编写测试,并在trie.ml
中简单地执行include The_real_trie
。 Trie
将完全The_real_trie
,但受trie.mli
中的信号限制,因此类型为抽象。