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