未绑定的构造函数错误
Unbound constructor error
据我了解,模块 interfaces/signatures 类似于 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 的新函数吗?
您可以查看像 https://github.com/janestreet/ppx_inline_test and http://batteries.vhugot.com/qtest/ 这样的测试库,在 Trie
模块中内联编写测试,其中类型不是抽象的。否则,是的,您将不得不提供一些函数来准确构造您想要的尝试,仅在测试期间使用,或者在接口中使类型具体化。您也可以使用 trie 遍历函数来测试您的尝试,而不是在测试期间手动构建示例尝试。
还有一种复杂的方法,您通过定义一些模块 The_real_trie
来为您的测试代码和 public 提供 Trie
模块的两个不同视图,而不是对其进行约束使用签名(例如 mli
文件),针对该模块编写测试,然后在 trie.ml
中简单地执行 include The_real_trie
。 Trie
将完全是 The_real_trie
,但受 trie.mli
中的签名约束,因此类型为抽象。
据我了解,模块 interfaces/signatures 类似于 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 的新函数吗?
您可以查看像 https://github.com/janestreet/ppx_inline_test and http://batteries.vhugot.com/qtest/ 这样的测试库,在 Trie
模块中内联编写测试,其中类型不是抽象的。否则,是的,您将不得不提供一些函数来准确构造您想要的尝试,仅在测试期间使用,或者在接口中使类型具体化。您也可以使用 trie 遍历函数来测试您的尝试,而不是在测试期间手动构建示例尝试。
还有一种复杂的方法,您通过定义一些模块 The_real_trie
来为您的测试代码和 public 提供 Trie
模块的两个不同视图,而不是对其进行约束使用签名(例如 mli
文件),针对该模块编写测试,然后在 trie.ml
中简单地执行 include The_real_trie
。 Trie
将完全是 The_real_trie
,但受 trie.mli
中的签名约束,因此类型为抽象。