我定义了以下函数来查找某个列表的倒数第二个元素(Int,string ...)
myButLast :: [a] -> a
myButLast [] = error "myButLast: empty list"
myButLast [x, _] = x
myButLast (_:xs) = myButLast xs
当我用hspec
测试时 it "returns an error for list of one element" $ do
myButLast [42] `shouldThrow` anyException
我收到以下错误
没有实例(Num(IO a0)) 来自文字
42' Possible fix: add an instance declaration for (Num (IO a0)) In the expression: 42 In the first argument of
myButLast',即[42]' In the first argument of
shouldThrow',即`myButLast [42]'
它是什么意思以及如何解决它?可能是所需课程的约束?
我想在myButLast中处理String和任何内容的列表。我使用多个元素进行的所有其他测试都有效。
答案 0 :(得分:4)
shouldThrow
的类型为Exception e => IO a -> Selector e -> Expectation
。这意味着第一个参数应该在IO monad中。要使用纯函数,可以使用evaluate
函数:
evaluate (myButLast [42]) `shouldThrow` anyException
顺便提一下,您可能希望测试特定错误,以确保在某些时候不会错误地更改错误:
evaluate (myButLast [42]) `shouldThrow` errorCall "myButLast: empty list"