如何使用带参数化类型的assertEqual

时间:2009-09-13 22:04:35

标签: testing haskell hunit

我正在尝试使用HUnit以TDD方式在Real World Haskell中进行练习。你可能已经猜到我还没有走得太远,所以当谈到Haskell时,我是一个绝对的初学者。鉴于以下代码,我如何解决ghci产生的以下错误:

  

不明确的类型变量a' in the constraints: 显示'           因在List_Test.hs使用“assertEqual”而使用assertEqual' at List_Test.hs:6:27-58 Eq a'引起的: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) 

我已尝试将类型约束添加到List声明和toList定义,但没有成功。互联网搜索也没有提供任何信息。

1 个答案:

答案 0 :(得分:6)

问题部分在于GHC不知道toList Nil会返回一个空列表。

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

它只知道它将返回类型a的列表,但它不知道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