有人可以向我解释为什么6 / 3有效但会6 / length [1, 2, 3]出错吗?
这是 REPL 中的错误
<interactive>:20:1: error:
• No instance for (Fractional Int) arising from a use of ‘/’
• In the expression: 6 / length [1, 2, 3]
In an equation for ‘it’: it = 6 / length [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
che*_*ner 11
(/)具有 type Fractional a => a -> a -> a,因此它的每个参数都必须是具有Fractional实例的某种类型的值。
二者6并3是多态的文字,具有类型Num a => a。因此,6/3具有类型Fractional a => a,因为Fractional是 的子类Num。
length,但是,总是返回一个Int,并且Int没有Fractional实例。最简单的解决方法是使用genericLength :: Num i => [a] -> ifromData.List代替,它可以返回Fractional a => a适合第二个参数的类型值to (/):
>>> import Data.List
>>> 6 / genericLength [1,2,3]
2.0
Run Code Online (Sandbox Code Playgroud)