2014-02-11 44 views
2

我已經定義了以下功能找到的東西列表的倒數第二個元素(智力,串...)函數定義的問題(沒有實例......從產生)

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中的任何字符串和列表。我所有其他測試與多元素的作品。

+2

'myButLast [x,_] = x'與一個具有兩個元素的列表匹配。如果你想匹配一個列表與一個元素:'myButLast [x] = x'或'myButLast(x:[])= x' – user2407038

回答

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" 
+0

什麼是評估導入? –

+0

在http://hspec.github.io/上找到'import Control.Exception(evaluate)' –