2017-01-30 3 views
0

は、私は私のGHCiのは、この簡単なコードをコンパイルしない理由がわからないMAX3 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" 

、問題を取得しています。それは大変なことではありません。

+2

'MAX3 ::整数 - >整数 - >整数 - >文字列 'は' max3 ::整数 - >整数 - >整数 - >整数 'ではない。 – Alec

答えて

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

@Erikが指摘しているように、関数はStringを返しています。与えられたエラーメッセージを使用してプログラムをクラッシュしますerrorを呼び出し、otherwise場合

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" 

:あなたが宣言された型を維持したい場合は、このようなものを持つことができます。 errorへのコールを、あなたのニーズに合わない場合は、より洗練されたものに置き換えることができます。

errorへの呼び出しのための一つの可能​​な代替にかかわらず、それは他の引数と同じだかどうかの最大値を返すために、次のようになります。

 ... 
     | c > a && c == b = c 
     | a > c && a == b = a 
     | b > a && c == b = b 
     | c == a && c == b = c 
関連する問題