I have defined the following function to find the penultimate element of a list of something (Int, string...)
myButLast :: [a] -> a myButLast  = error "myButLast: empty list" myButLast [x, _] = x myButLast (_:xs) = myButLast xs
When I test it with hspec
it "returns an error for list of one element" $ do myButLast  `shouldThrow` anyException
I get the following error
No instance for (Num (IO a0))
arising from the literal
Possible fix: add an instance declaration for (Num (IO a0))
In the expression: 42
In the first argument ofmyButLast', namely
In the first argument ofshouldThrow', namely `myButLast '
What does it mean and how to fix it ? May be a constraint of class needed?
I want to handle String and list of anything in myButLast. All my other tests with multiples elements works.
shouldThrow has the type
Exception e => IO a -> Selector e -> Expectation. This means that the first argument should be in the IO monad. In order to use pure functions, you can use the
evaluate (myButLast ) `shouldThrow` anyException
Incidentally, you might want to test for the specific error to make sure it doesn't get mistakenly changed at some point:
evaluate (myButLast ) `shouldThrow` errorCall "myButLast: empty list"