2017-04-03 159 views
0

我見過的所有其他平均問題都比我需要的要複雜得多。我對Haskell很新,我目前正在通過The Craft of Functional Programming 2nd Edition。簡單的Haskell平均函數提供了無法匹配的類型錯誤

在第3章中有一個練習來寫一個簡單的函數來平均3個整數。提供函數類型簽名,並在我的解決方案中使用它。我寫道:

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

我用ghci的編譯,當我嘗試和加載我的文件,我得到「無法匹配預期Float' with actual type類型INT'」。我如何解決這個錯誤?

回答

1

表達式a + b + c將具有類型Int,並且/甚至未被定義爲Int。 GHC可能會推斷3的類型爲Float。你必須明確地投的類型在這種情況下,所以你需要做的

fromIntegral (a + b + c)/3 

fromIntegral功能需要一個Integral a => a型像IntInteger,並將其轉換爲Num b => b類型,這也可能是IntIntegralFloat,DoubleComplex Double,甚至自定義數字類型。

+0

就是這樣,謝謝。 –

0

(/) :: Fractional a => a -> a -> a,這意味着/取兩個相同類型的小數,並返回相同類型的小數。你給它一個Int作爲參數,這不是分數,並且要求輸出Float。在將其發送給/之前,您必須將您的Int轉換爲Float。使用fromIntegral :: Int -> FloatfromIntegral (a + b + c)/3。你也可以放棄類型簽名並向ghci詢問推斷出的類型。

1

您應該使用Fractional,以支持房地產事業部:

averageThree :: Fractional a => a -> a -> a -> a 
averageThree a b c = (a + b + c)/3 
相關問題