在haskell的Max3,我收到了错误

时间:2017-01-30 00:18:33

标签: haskell

当我运行我的haskell程序时,我遇到了问题,

max3:: Integer -> Integer -> Integer -> Integer
max3 a b c
          | a > b && a > c = show a
          | b > a && b > c = show b
          | c > a && c > b = show c
          | otherwise = show "At least two numbers are the same"

我不知道为什么我的GHCI不能编译这个简单的代码。请它一定不要那么难。

2 个答案:

答案 0 :(得分:3)

您的函数返回String,但您的类型注释表明它返回Integer

如果您想要String错误消息,请考虑使用Either

 max3:: Integer -> Integer -> Integer -> Either String Integer
 max3 a b c
   | a > b && a > c = Right a
   | b > a && b > c = Right b
   | c > a && c > b = Right c
   | otherwise = Left "At least two numbers are the same"

答案 1 :(得分:1)

正如@Erik指出的那样,你的函数返回String。如果你想保留你声明的类型,你可以这样:

max3 :: Integer -> Integer -> Integer -> Integer
max3 a b c
      | a > b && a > c = a
      | b > a && b > c = b
      | c > a && c > b = c
      | otherwise = error "At least two numbers are the same"

otherwise的情况下,调用error会使程序崩溃并显示给定的错误消息。如果error的调用不符合您的需要,您可以将其替换为更复杂的调用。

调用error的一个可能的替代方法是返回最大值,无论它是否与其他参数相同:

      ...
      | c > a && c == b = c
      | a > c && a == b = a
      | b > a && c == b = b
      | c == a && c == b = c