如何解决单元测试中的类型歧义



我不知道如何正确注释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 $ asserequal "mylast3":

由于使用asserequals类型而产生的(Show a0)没有实例变量a0是不明确的

由于列表[]没有任何成员,因此只能通过类型推断推断出[]属于[a]类型。

对于一个列表是"可显示的",它必须是类型类Show的实例。如果一个列表的成员也是Show的实例,那么这个列表就是Show的实例。

但是类型检查器不能将[]的类型推断为比[a]更具体的类型。我们不能知道a是否是Show的一个实例,所以我们也不能知道[a]是否是Show的一个实例。

如果我们简单地注释一个特定的类型 ([] :: [Int]),将不会有错误!

这是因为我们知道IntShow的实例,因此[Int]也是Show的实例。现在编译器可以推断出打印列表所需的信息了!

最新更新