函数定义问题(没有...的实例)

时间:2014-02-11 21:40:51

标签: haskell

我定义了以下函数来查找某个列表的倒数第二个元素(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和任何内容的列表。我使用多个元素进行的所有其他测试都有效。

1 个答案:

答案 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"