代码之家  ›  专栏  ›  技术社区  ›  Maxxx

在Haskell中执行断言

  •  0
  • Maxxx  · 技术社区  · 6 年前

    computeSum :: Int -> Int -> Int
    computeSum x y = x + y
    

    控制形式 超过 返回值 把两个数字相加 总和 非负且必须小于10 ?

    if value <= 10 and value > 0:
       return value
    

    只是想知道哈斯克尔是否有类似的东西?

    3 回复  |  直到 6 年前
        1
  •  7
  •   willeM_ Van Onsem    6 年前

    典型的是使用 Maybe 指定“可能失败”的计算,例如:

    computeSum :: Int -> Int -> Maybe Int
    computeSum x y | result > 0 && result <= 10 = Just result
                   | otherwise = Nothing
        where result = x + y

    Just result Nothing 以防断言不满足。

    有时 Either String a

    computeSum :: Int -> Int -> Either String Int
    computeSum x y | result > 0 && result <= 10 = Right result
                   | otherwise = Left "Result is note between 0 and 10"
        where result = x + y

    你也可以提出一个错误,但我个人认为这是不可取的,因为签名并没有“暗示”计算可能失败:

    computeSum :: Int -> Int -> Int
    computeSum x y | result > 0 && result <= 10 = result
                   | otherwise = error "result is not between 0 and 10"
        where result = x + y
        2
  •  3
  •   AJF    6 年前

    是的,胡格尔告诉我们 Control.Exception 提供 assert :: Bool -> a -> a

    但你可以自己写:

    assert :: Bool -> a -> a
    assert False _ = error "Assertion failed!"
    assert _     a = a
    
        3
  •  3
  •   Thomas M. DuBuisson    6 年前

    是的,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."