無法演繹(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)