雖然在Haskell做一些TTD,我最近制定了以下功能:強制執行嚴格哈斯克爾
import Test.HUnit
import Data.Typeable
import Control.Exception
assertException :: (Show a) => TypeRep -> IO a -> Assertion
assertException errType fun = catch (fun >> assertFailure msg) handle
where
msg = show errType ++ " exception was not raised!"
handle (SomeException e) [...]
該函數預期異常和IO動作的類型的代表。問題是,大部分時間我都沒有得到拋出的異常,即使我應該這樣做,因爲懶惰。通常fun
的失敗部分實際上從來沒有在這裏評估過。
爲了彌補這一點,我試圖用(seq fun $ assertFailure msg)
替換(fun >> assertFailure msg)
。我還嘗試啓用BangPatterns擴展,並在fun
綁定之前發出一聲巨響,但沒有任何幫助。那麼我怎麼才能真正強迫Haskell嚴格評估fun
?
是什麼*使用代碼*'assertException'什麼樣子的? – Rufflewind 2014-10-18 22:38:53
你可能想用'try'而不是'catch'。這至少是'TestThrow'在'Test.Hspec'中實現的方式。 – Zeta 2014-10-18 23:45:44