在 Haskell 中执行断言
Performing assertions in Haskell
假设我有一个计算两个数字之和的函数:
computeSum :: Int -> Int -> Int
computeSum x y = x + y
是否有任何 形式的控制 超过 returned 值 从上面的函数我只想要 求和两个数字,其中它们的总和将为非负数且必须小于10?
我刚从命令式开始函数式编程,我们可以在命令式编程中简单检查函数的 return 值,例如:
if value <= 10 and value > 0:
return value
只是想知道haskell中是否有类似的东西?
是的,Hoogle告诉我们Control.Exception
提供了assert :: Bool -> a -> a
。
但是你可以自己写:
assert :: Bool -> a -> a
assert False _ = error "Assertion failed!"
assert _ a = a
通常 ones 使用 Maybe
来指定 "might fail" 的计算,例如:
computeSum :: Int -> Int -> <b>Maybe Int</b>
computeSum x y | result > 0 && result <= 10 = <b>Just</b> result
| otherwise = <b>Nothing</b>
where result = x + y
所以它将 return 一个 Just result
如果断言匹配,或者 Nothing
如果断言不满足。
有时 Either String a
用于提供错误消息,例如:
computeSum :: Int -> Int -> <b>Either String Int</b>
computeSum x y | result > 0 && result <= 10 = <b>Right</b> result
| otherwise = <b>Left</b> "Result is note between 0 and 10"
where result = x + y
你也可以报错,但我个人认为这是不可取的,因为签名不会"hint"计算可能失败:
computeSum :: Int -> Int -> <b>Int</b>
computeSum x y | result > 0 && result <= 10 = result
| otherwise = <b>error</b> "result is not between 0 and 10"
where result = x + y
是的,Haskell 有 if 语句:
function x y =
let r = x + y
in if r > 0 && r <= 10
then r
else error "I don't know what I'm doing."
假设我有一个计算两个数字之和的函数:
computeSum :: Int -> Int -> Int
computeSum x y = x + y
是否有任何 形式的控制 超过 returned 值 从上面的函数我只想要 求和两个数字,其中它们的总和将为非负数且必须小于10?
我刚从命令式开始函数式编程,我们可以在命令式编程中简单检查函数的 return 值,例如:
if value <= 10 and value > 0:
return value
只是想知道haskell中是否有类似的东西?
是的,Hoogle告诉我们Control.Exception
提供了assert :: Bool -> a -> a
。
但是你可以自己写:
assert :: Bool -> a -> a
assert False _ = error "Assertion failed!"
assert _ a = a
通常 ones 使用 Maybe
来指定 "might fail" 的计算,例如:
computeSum :: Int -> Int -> <b>Maybe Int</b>
computeSum x y | result > 0 && result <= 10 = <b>Just</b> result
| otherwise = <b>Nothing</b>
where result = x + y
所以它将 return 一个 Just result
如果断言匹配,或者 Nothing
如果断言不满足。
有时 Either String a
用于提供错误消息,例如:
computeSum :: Int -> Int -> <b>Either String Int</b>
computeSum x y | result > 0 && result <= 10 = <b>Right</b> result
| otherwise = <b>Left</b> "Result is note between 0 and 10"
where result = x + y
你也可以报错,但我个人认为这是不可取的,因为签名不会"hint"计算可能失败:
computeSum :: Int -> Int -> <b>Int</b>
computeSum x y | result > 0 && result <= 10 = result
| otherwise = <b>error</b> "result is not between 0 and 10"
where result = x + y
是的,Haskell 有 if 语句:
function x y =
let r = x + y
in if r > 0 && r <= 10
then r
else error "I don't know what I'm doing."