未绑定的构造函数错误

时间:2016-02-04 21:03:26

标签: ocaml

据我所知,模块接口/签名就像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或者其他东西的新函数吗?

1 个答案:

答案 0 :(得分:4)

您可以查看测试库https://github.com/janestreet/ppx_inline_testhttp://batteries.vhugot.com/qtest/,以便在Trie模块中内联编写测试,其中类型不是抽象的。否则,是的,您必须提供一些函数来构造您想要的尝试,仅在测试期间使用,或者在接口中使类型具体化。您也可以使用trie遍历函数来测试您的尝试,而不是在测试期间手动构建示例尝试。

还有一种复杂的方法,您可以通过定义某个模块Trie来为您的测试代码和公共提供The_real_trie模块的两个不同视图,而不是用签名约束它(例如一个mli文件),针对该模块编写测试,并在trie.ml中简单地执行include The_real_trieTrie将完全The_real_trie,但受trie.mli中的信号限制,因此类型为抽象。