1

我不知道如何正确注释 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 产生 (Show a0) 的实例 类型变量 a0 不明确

4

1 回答 1

4

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

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

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

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

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

于 2015-07-31T21:30:50.560 回答