gpt4 book ai didi

haskell - 断言是如何使用的?

转载 作者:行者123 更新时间:2023-12-02 02:53:52 25 4
gpt4 key购买 nike

我无法理解如何使用断言函数 (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)

最佳答案

assert从那个库(我没有使用过)导出的实际上是在 base 中定义的。 here .你可以像这样使用它:

power :: Int -> Int -> Int
power x n = assert (n >= 0) $
if n == 0 then
1
else
x * power x (n - 1)

但这并不是该函数的真正用途。在上述情况下,最好使用友好消息引发您自己的错误,或者(更好)返回 Maybe Int .
assert用于检查函数中的内部不变量,其中违规表示错误。将断言与测试结合使用非常有用(测试执行不变量,由内部 assert 调用检查)。

您必须确保在没有优化或使用 -fno-ignore-asserts 的情况下进行编译。但是,当使用优化进行编译时,断言会被优化掉( assert 的另一个重要特性)。

我已经在库代码中包含以下内容,以便在我的测试套件中进行断言的测试(非常重要,并且我之前遇到过一个问题):
assertionCanary :: IO Bool
assertionCanary = do
assertionsWorking <- try $ assert False $ return ()
return $
case assertionsWorking of
Left (AssertionFailed _) -> True
_ -> False

关于haskell - 断言是如何使用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52227157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com