测试采用空列表的函数

时间:2014-11-04 21:28:53

标签: unit-testing haskell hunit

我试图为一个简单的函数编写一个单元测试,它接受一个列表并返回它,

func :: [a] -> [a]
func x = x

使用测试代码测试它是否在给定空列表时按预期工作

emptyListTest :: Test
emptyListTest = TestCase $ assertEqual "for (func [])," [] $ func []

main :: IO Counts
main = runTestTT $ TestList [emptyListTest]

然而,我收到错误

No instance for (Show a0) arising from a use of `assertEqual'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
  instance Show Double -- Defined in `GHC.Float'
  instance Show Float -- Defined in `GHC.Float'
  instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
    -- Defined in `GHC.Real'
  ...plus 28 others
In the expression: assertEqual "for (func [])," []
In the second argument of `($)', namely
  `assertEqual "for (func [])," [] $ func []'
In the expression:
  TestCase $ assertEqual "for (func [])," [] $ func []

使用非空列表的其他测试工作正常,通过调用func []中的ghci手动测试时,该功能正常工作。

我还注意到,如果我创建一个虚拟类型,并制作一个列表中的元素(如果这是正确的说法),那么将其传递给测试似乎工作,测试通过

data Dummy = Dummy
    deriving(Eq, Show)

emptyList :: [Dummy]
emptyList = []

emptyListTest :: Test
emptyListTest = TestCase $ assertEqual "for (func [])," [] $ func emptyList

这是为什么?有没有办法用空列表测试函数而不需要沿着虚拟类型路由?

2 个答案:

答案 0 :(得分:4)

好吧,错误告诉你究竟出了什么问题。阅读它。

 The type variable `a0' is ambiguous

所以,输入你的变量!除非你这样做,GHC不可能知道用什么类型进行测试。

emptyListTest = TestCase $ assertEqual "for (func [])," [] $ func ([] :: [Int])

您可能必须启用扩展才能内联。

答案 1 :(得分:1)

您需要为空列表提供一个类型 - 否则GHC不知道您使用的是哪种列表。

一种可能的解决办法:

.... assertEqual "for (func [])," [] $ func ([] :: [Int])