我无法弄清楚如何正确地注释mylast3测试:
import Test.HUnit
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast [x] = Just x
mylast (_:xs) = mylast xs
testsMyLast =
[TestCase $ assertEqual "mylast1" (Just 1) $ mylast [1],
TestCase $ assertEqual "mylast2" (Just 'b') $ mylast "ab",
TestCase $ assertEqual "mylast3" Nothing $ mylast [] <== how to test this correctly?
]
main = do runTestTT $ TestList testsMyLast
我收到以下错误,指向“TestCase $ assertEqual”mylast3“:
使用assertEqual产生的(显示a0)没有实例类型 变量a0是不明确的
答案 0 :(得分:4)
由于列表[]
没有任何成员,因此只能从[]
类型为[a]
的类型推断中推断出来。
要使列表“可显示”,它必须是类型类Show
的实例。如果列表的成员也是Show
的实例,则列表只是Show
的实例。
但是类型检查器无法将[]
的类型推断为比[a]
更具体的类型。我们无法知道a
是否是Show
的实例,因此我们无法知道[a]
是否是{的实例{1}}。
如果我们只是注释特定类型 Show
,就不会有错误!
这是因为我们知道([] :: [Int])
是Int
的实例,因此Show
也是[Int]
的实例。现在编译器可以推断出打印列表所需的信息!