我无法理解如何使用assert函数(Control.Exception.Assert)
我确实阅读了文档(http://hackage.haskell.org/package/assert-0.0.1.2/docs/Control-Exception-Assert.html),但我似乎还不明白它是如何使用的.在这种情况下,currying真的没有用,因为它是多么不明确.它的例子和解释很可爱.
(对于上下文,我试图弄清楚如何在这段代码中使用assert来确保n总是非负的)[请不要回答,我想自己弄清楚]
power :: Int -> Int -> Int
power x n =
if n == 0 then
1
else
x * power x (n - 1)
Run Code Online (Sandbox Code Playgroud)
在assert该库(我没用过)出口实际上是在定义base 在这里.你可以像这样使用它:
power :: Int -> Int -> Int
power x n = assert (n >= 0) $
if n == 0 then
1
else
x * power x (n - 1)
Run Code Online (Sandbox Code Playgroud)
但这并不是函数的意思.在上面的情况下,使用友好消息提出自己的错误会更好,或者(更好),返回a Maybe Int.
assert用于检查函数中的内部不变量,其中违规表示错误.将断言与测试结合使用非常有用(测试练习不变量,由内部assert调用检查).
您必须确保在没有优化的情况下进行编译,或者-fno-ignore-asserts在编译时使用优化(另一个很棒的特性assert)来优化断言.
我已经将以下内容包含在库代码中,以便测试我的testsuite中的断言是否已经开启(非常重要,以及我之前遇到过的一个问题):
assertionCanary :: IO Bool
assertionCanary = do
assertionsWorking <- try $ assert False $ return ()
return $
case assertionsWorking of
Left (AssertionFailed _) -> True
_ -> False
Run Code Online (Sandbox Code Playgroud)