2009-09-13 13 views
3

J'essaie de faire les exercices dans Real World Haskell dans un mode TDD, en utilisant HUnit. Comme vous l'avez probablement deviné, je ne suis pas encore loin, donc je suis un débutant absolu en ce qui concerne Haskell. Étant donné le code suivant comment puis-je résoudre le ghci d'erreur suivant produit:Comment travailler avec assertEqual avec les types paramétrés

Type Ambigu variables a' in the constraints: Afficher une « résultant d'une utilisation de l'équation assertEqual' at List_Test.hs:6:27-58 un » résultant d'une utilisation de `assertEqual » à List_Test.hs: 6: 27-58 fix probable: ajouter une signature de type qui fixe ces variables de type (s)

de 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) 

J'ai essayé d'ajouter des contraintes de type à la fois à la déclaration List et à la définition toList sans succès. Une recherche sur Internet n'a également fourni aucune information.

Répondre

6

Le problème est en partie que GHC ne sait pas que toList Nil retournera une liste vide.

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

Il sait seulement qu'il renvoie une liste de type a, mais il n'a aucune idée de ce que a est - d'où le message « variable de type ambigu a ». Une façon de contourner cela est de simplement préciser le type de liste qui toList retournera:

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

Changement que, et en supprimant les deux premières lignes de List_Test (il ne sera pas une fonction main dans un module nommé qui n'est pas nommé Main), m'a donné ce résultat:

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

grâce, ne connaissait pas la syntaxe pour spécifier le type de retour pour un appel donné à une fonction. –