【发布时间】:2014-12-14 05:32:12
【问题描述】:
在 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 的失败部分实际上从未在这里进行评估。
为了解决这个问题,我尝试将(fun >> assertFailure msg) 替换为(seq fun $ assertFailure msg)。我还尝试启用 BangPatterns 扩展并在 fun 绑定之前添加一个 bang,但没有任何帮助。那么如何才能真正强制 Haskell 严格评估 fun?
【问题讨论】:
-
使用
assertException的代码是什么样的? -
您可能希望使用
try而不是catch。这至少是shouldThrow在Test.Hspec中实现的方式。
标签: haskell exception-handling strict