无法演绎(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)