2016-02-04 116 views
3

從我所瞭解的模塊接口/簽名就像Java中的接口。我有點理解爲什麼我得到未綁定的構造函數錯誤,但我不知道該怎麼做。未綁定的構造函數錯誤

我有一個線索模塊,這是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或new的新函數?

+0

未綁定的構造函數的名稱是什麼?你能提供完整的錯誤信息嗎? – ivg

回答

4

你可以看看像https://github.com/janestreet/ppx_inline_testhttp://batteries.vhugot.com/qtest/這樣的測試庫來在Trie模塊中內聯編寫測試,其中類型不是抽象的。否則,是的,你將不得不提供一些函數來構建你想要的嘗試,只能在測試過程中使用,或者在界面中使用具體的類型。您也可以使用trie遍歷函數來測試您的嘗試,而不是在測試期間手動構建示例嘗試。

還有一個令人費解的做法,在你給你的測試代碼,並通過定義一些模塊The_real_trie,不具有簽名限制它(如mli文件)市民兩種不同的意見Trie模塊,寫你的根據該模塊進行測試,並在trie.ml中簡單地執行include The_real_trieTrie將完全是The_real_trie,但受trie.mli中的簽名限制,因此使用抽象類型。

+0

感謝您的回覆。事實證明,在簽名中聲明瞭空,所以我可以使用它並插入以創建實驗。 –