在 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."