2015-02-13 4 views
1

Часть Queue.hs:Как проверить свои собственные типы данных с помощью HUnit в Haskell?

module Queue (Queue, emptyQueue, isEmptyQueue, enQueue, deQueue) where 

data Queue a = EmptyQueue | Single a | Q a (Queue a) a deriving (Show, Eq) 

emptyQueue :: Queue a 
emptyQueue = EmptyQueue 

enQueue :: a -> Queue a -> Queue a 
enQueue x EmptyQueue = Single x 
enQueue x (Single q) = Q q (EmptyQueue) x 
enQueue x (Q qf q qb) = Q qf (enQueue qb q) x 

Я использовал печать, увидеть, если их правильно один на один. Теперь я хочу протестировать их с помощью HUint.

Main.hs:

module Main where 
import Queue 
import Test.HUnit 

test1 = TestCase $ assertEqual "" (Single 'a'::Queue Char) $ enQueue 'a' emptyQueue 
tests = TestList [TestLabel "test1" test1] 

main = do runTestTT tests 

Вот что я получил:

*Queue> :r 
[2 of 2] Compiling Main    (Main.hs, interpreted) 

Main.hs:5:36: Not in scope: data constructor ‘Single’ 
Failed, modules loaded: Queue. 

Так как я могу это исправить?

+1

Как вы экспортируете тип 'Queue' из' Queue.hs'? Если у вас есть 'module Queue (Queue), где ...' он не будет экспортировать конструкторы, вам понадобится 'module Queue (Queue (..)), где' для экспорта всех конструкторов типа' Queue'. – bheklilr

+0

@bheklilr У меня есть вопросы. – liubiantao

+1

Ошибка все еще не исправлена. Добавьте '' (..) '' ко второй очереди в Queue.hs – ThreeFx

ответ

1

Кажется, что тип данных Queue должен быть абстрактным и непрозрачным, поэтому разоблачение всех конструкторов - не очень хорошая идея. Тем не менее, вы можете разделить вашу реализацию на два подмодулями:

module Queue.Internal where --expose all internal stuff 

data Queue = <...> 


module Queue (Queue, emptyQueue, <...>) where --expose user API only 

import Queue.Internal 


module Queue.Tests where 

import Queue.Internal --to get access to „guts“ 

test = <...> 


module Main where 

import Queue --to just use the type 

Некоторые типы библиотек (например, ByteString s) выполнены таким образом.

+0

Файл Queue.hs является присваиванием, только он может добавить реализацию под ним. Кажется, что ByteString - хорошая идея, я пробовал это, но как я мог преобразовать результат (enQueue 'a' emptyQueue) в ByteString? – liubiantao

+0

@liubiantao Я имел в виду не использовать ByteString, а проверять, как он организован внутри. Ну, если у вас есть только один модуль, вам нужно экспортировать все конструкторы «Queue» (как уже было предложено) или написать тесты в модуле Queue и экспортировать тестовый костюм. – Yuuri