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-58Eq 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定义,但没有成功.互联网搜索也没有提供任何信息.
问题部分是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