为什么 6 / length [1, 2, 3] 在 Haskell 中不起作用

Cro*_*ade 5 haskell types

有人可以向我解释为什么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实例的某种类型的值。

二者63是多态的文字,具有类型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)

  • 您还可以在使用常规“length”和“fromIntegral (length [1,2,3])”之后进行转换 - 这是您在实践中看到的正常方法。 (3认同)