3

我正在尝试使用HUnit以 TDD 方式在 Real World Haskell 中进行练习。正如您可能猜到的那样,我还没有走多远,所以当谈到 Haskell 时,我绝对是初学者。给定以下代码,我如何解决 ghci 产生的以下错误:

模棱两可的类型变量a' in the constraints: Show a' 由于使用assertEqual' at List_Test.hs:6:27-58 Eq a' 源于在 List_Test.hs:6:27-58 处使用 `assertEqual' 可能的修复:添加修复这些类型变量的类型签名

List_Test.hs:

module List_Test
where
import List
import Test.HUnit

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

main = runTestTT fromEmptyList

列表.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 定义添加类型约束但没有成功。互联网搜索也没有提供任何信息。

4

1 回答 1

6

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

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

它只知道它将返回一个 type 列表a,但它不知道是什么a- 因此是“模糊类型变量 a”消息。解决此问题的一种方法是仅指定 toList 将返回的列表类型:

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

更改它并删除 List_Test 的前两行(它不会main在未命名的命名模块中查找函数Main),给了我这个结果:

$ runghc List_Test.hs
案例:1 尝试:1 错误:0 失败:0
于 2009-09-13T22:13:57.723 回答