2016-02-04 2 views
3

Насколько я понимаю, интерфейсы модулей/подписи подобны интерфейсам на Java. Я почему-то понимаю, почему я получил ошибку связанного конструктора, но я не уверен, что с этим делать.Ошибка конструктора Unbound

У меня есть модуль 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

Какое имя несвязанного конструктора? Можете ли вы предоставить полное сообщение об ошибке? – ivg

ответ

4

Вы можете посмотреть библиотеки тестирования, такие как https://github.com/janestreet/ppx_inline_test и http://batteries.vhugot.com/qtest/, чтобы написать свои тесты inline в модуле Trie, где тип не является абстрактным. В противном случае, да, вам придется либо предоставить некоторые функции для построения именно тех попыток, которые вы хотите, которые будут использоваться только во время тестирования, либо сделать тип конкретным в интерфейсе. Вы также можете уйти с помощью функций trie traversal для тестирования своих попыток, а не для создания примера при попытке вручную во время тестирования.

Существует также извилистый подход, в котором вы даете свой код тестирования и общественные два различных вида Trie модуля, определяя некоторый модуль The_real_trie, не стесняя его с подписью (например, mli файл), написание вашего тесты против этого модуля, а в trie.ml просто делают include The_real_trie. Trie будет тогда точно The_real_trie, но сдерживается signatrue в trie.mli, поэтому с абстрактным типом.

+0

Благодарим за отзыв. Оказывается, пустая была объявлена ​​в подписи, поэтому я мог просто использовать ее и вставлять для создания Tries. –

Смежные вопросы