当我运行我的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不能编译这个简单的代码。请它一定不要那么难。
答案 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