無法演繹(Fractional Int)......
標題中的錯誤訊息是常見的初學者錯誤。讓我們看看它是如何產生的以及如何解決它。
假設我們需要計算一個數字列表的平均值; 以下宣告似乎會這樣做,但它不會編譯:
averageOfList ll = sum ll / length ll
問題在於 (/)
函式的劃分:它的簽名是 (/) :: Fractional a => a -> a -> a
,但在上面的情況下,分母(由 length::Foldable t => t a -> Int
給出)的型別為 Int
(並且 Int
不屬於 Fractional
類),因此出現錯誤訊息。
我們可以用 fromIntegral :: (Num b, Integral a) => a -> b
修復錯誤資訊。可以看到此函式接受任何 Integral
型別的值並返回 Num
類中的相應值:
averageOfList' :: (Foldable t, Fractional a) => t a -> a
averageOfList' ll = sum ll / fromIntegral (length ll)