我正在尝试使用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定义,但没有成功。互联网搜索也没有提供任何信息。
答案 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