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 [42] `shouldThrow` anyException
I get the following error
No instance for (Num (IO a0)) arising from the literal
42' Possible fix: add an instance declaration for (Num (IO a0)) In the expression: 42 In the first argument of
myButLast', namely[42]' In the first argument of
shouldThrow', namely `myButLast [42]'
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.
myButLast [x, _] = x
matches a list with exactly two elements. If you want to match a list with one element:myButLast [x] = x
ormyButLast (x:[]) = x
– user2407038