2009-09-13 3 views
3

Я пытаюсь выполнить упражнения в реальном мире Haskell в режиме TDD, используя HUnit. Как вы, наверное, догадались, что мне еще далеко не удалось, поэтому я абсолютно новичок, когда дело доходит до Haskell. Учитывая следующий код, как я могу решить следующую GHCI ошибки производит:Как работать с assertEqual с параметризованными типами

Неопределенного типа переменная a' in the constraints: Показать а « , вытекающей из использования assertEqual' at List_Test.hs:6:27-58 уравнения а», вытекающие из использования `assertEqual» в List_Test.hs: 6: 27-58 Возможная ошибка: добавить сигнатуру типа, который фиксирует эти типа переменной (ы)

List_Test.hs:

module List_Test 
where 
import List 
import Test.HUnit 

fromEmptyList = TestCase $ assertEqual "" [] (toList (Nil)) 

main = runTestTT fromEmptyList 

List.hs:

module List 
where 
data List a = Cons a (List a) 
      | Nil 
       deriving (Show) 

toList Nil = [] 
toList (Cons a b) = (:) a (toList b) 

Я пробовал добавлять ограничения типа как к объявлению списка, так и к определению toList без успеха. Интернет-поиск также не предоставил никакой информации.

ответ

6

Проблема частично в том, что GHC не знает, что toList Nil вернет пустой список.

*List> :i toList 
toList :: List a -> [a]  -- Defined at List.hs:7:0-5 

Он только знает, что он будет возвращать список типа a, но это не имеет ни малейшего представления, что a это - отсюда и «неоднозначный переменную типа» сообщение. Один из способов обойти это просто указать тип списка, который ToList возвратит:

fromEmptyList = TestCase $ assertEqual "" [] (toList (Nil) :: [Int]) 

Изменение, что и удаление первые две строки List_Test (он не будет искать main функции в имени модуля что не названо Main), дал мне этот результат:

 
$ runghc List_Test.hs 
Cases: 1 Tried: 1 Errors: 0 Failures: 0 
+0

спасибо, не знал о синтаксисе, чтобы указать тип возвращаемого значения для данного вызова функции. –

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