2017-04-03 13 views
0

私が見た他の平均的な質問は、私が必要とするものよりはるかに複雑です。私はHaskellにとって非常に新しく、私は現在The Craft of Functional Programming第2版で作業しています。単純なHaskellの平均関数は型エラーと一致しません

第3章では、平均3つの整数に単純な関数を書く演習があります。関数型シグネチャが提供され、私はそれを私のソリューションで使用しました。私が書いた:

averageThree :: Int -> Int -> Int -> Float 
averageThree a b c = (a + b + c)/3 

私はコンパイルにGHCiのを使用して、私がしようとすると、私のファイルをロードするとき、私は「期待タイプFloat' with actual typeのInt 'と一致しませんでした」を得ます。このエラーを修正するにはどうすればよいですか?

答えて

1

式は、タイプIntであり、/は、Intについても定義されていません。 GHCはおそらく3がタイプFloatを持っていると推測するでしょう。あなたが明示的にこのような状況でタイプをキャストする必要があり、そうあなたがする必要があると思い

fromIntegral (a + b + c)/3 

fromIntegral機能はIntまたはIntegerようIntegral a => aタイプをとり、またIntかである可能性がありNum b => bタイプ、に変換しますIntegral、またはFloat,、Complex Double、およびカスタム数値型です。

+0

それだこと、ありがとうございます。 –

0

(/) :: Fractional a => a -> a -> aを意味します。つまり、/は、同じタイプの2つの小数を取り、同じタイプの小数を返します。引数にはIntを分数ではなく、Floatとして出力します。 Intをに変換してから/に送信する必要があります。 fromIntegral :: Int -> Floatを使用してください。 fromIntegral (a + b + c)/3。また、型署名を残して、推論型のghciを尋ねることもできます。

1

レアル部門をサポートするために、Fractionalを使用する必要があります。

averageThree :: Fractional a => a -> a -> a -> a 
averageThree a b c = (a + b + c)/3 
関連する問題