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

Bas*_*ink 3 testing haskell hunit

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

不明确的类型变量在List_Test.hs中显示由于使用"assertEqual"而产生的" a' in the constraints: 使用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
Run Code Online (Sandbox Code Playgroud)

List.hs:

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

toList Nil = []
toList (Cons a b) = (:) a (toList b) 
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*off 6

问题部分是GHC不知道toList Nil会返回一个空列表.

*List> :i toList
toList :: List a -> [a]     -- Defined at List.hs:7:0-5
Run Code Online (Sandbox Code Playgroud)

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

fromEmptyList = TestCase $ assertEqual "" [] (toList (Nil) :: [Int])
Run Code Online (Sandbox Code Playgroud)

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

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