断言是如何使用的?

Hay*_*sme 2 haskell

我无法理解如何使用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)

jbe*_*man 6

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)

  • 如果你不想修改`power`的主体,你可以添加等式`power _ n | assert(n> = 0)False = undefined`在它之前(这个技巧是由于Oleg:http://okmij.org/ftp/Haskell/#making-function-strict). (2认同)