HUnit TestCase с ошибкой типа - PullRequest
       17

HUnit TestCase с ошибкой типа

3 голосов
/ 23 марта 2011

Я написал функцию, похожую на LISP flatten:

data NestedList a = Elem a | List [NestedList a]

flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List xs) = concatMap flatten xs

Эти два тестовых примера работают нормально:

test1 = TestCase (assertEqual "test singleton" [5] (flatten (Elem 5)))
test2 = TestCase (assertEqual "test mixed" 
                              [1,2,3,4]
                              (flatten (List [Elem 1, 
                                              List [Elem 2, Elem 3],
                                              Elem 4])))

Однако этот отчет сообщает об ошибке типа:

test3 = TestCase (assertEqual "test empty" [] (flatten (List [])))

Тестирование из REPL работает нормально:

*Main> [] == flatten (List [])
True

Почему я получаю сообщение об ошибке и как мне написать тест-кейс для пустого списка?

РЕДАКТИРОВАТЬ: Вот точное сообщение об ошибке:

Ambiguous type variable `a0' in the constraints:
  (Show a0) arising from a use of `assertEqual'
            at D:\haskell\source.hs:61:19-29
  (Eq a0) arising from a use of `assertEqual'
          at D:\haskell\source.hs:61:19-29
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `TestCase', namely
  `(assertEqual "test empty" [] (flatten (List [])))'

Ответы [ 2 ]

7 голосов
/ 23 марта 2011

Я предполагаю, что проблема в том, что компилятор не может определить тип пустого списка.Это может быть [Int], [Char], что угодно.Попробуйте дать ему какой-то тип, который точно не имеет значения.

test3 = TestCase (assertEqual "test empty" ([] :: [Int]) (flatten (List [])))

Обратите внимание, что в других случаях компилятор может определить тип списка.

2 голосов
/ 23 марта 2011

Как уже сообщается в сообщении об ошибке, необходимо добавить сигнатуру типа в список в тесте модулей.Возможно так:

test3 = TestCase (assertEqual "test empty" ([]::[()]) (flatten (List [])))
...