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

时间:2015-07-31 21:21:17

标签: haskell maybe hunit

我无法弄清楚如何正确地注释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是不明确的

1 个答案:

答案 0 :(得分:4)

由于列表[]没有任何成员,因此只能从[]类型为[a]的类型推断中推断出来。

要使列表“可显示”,它必须是类型类Show的实例。如果列表的成员也是Show的实例,则列表只是Show的实例。

但是类型检查器无法将[]的类型推断为比[a]更具体的类型。我们无法知道a是否是Show的实例,因此我们无法知道[a]是否是{的实例{1}}。

如果我们只是注释特定类型 Show,就不会有错误!

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