缺少某个 Haskell 类型转换

Missing a certain Haskell type conversion

在 GHCiOnline 中,let listRestDiv 4 = floor(4/(fromInteger (nextPrimeDiv 4))) 确实有效,但一般

let listRestDiv n = floor(n/(fromInteger (nextPrimeDiv n)))

不被接受,其中nextPrimeDiv n

给出
let nextPrimeDiv n = head [x|x<-[1..n], n `mod` x == 0, x/=1]

只是 returns 下一个素数。

它说:

Could not deduce (RealFrac Integer) arising from a use of `floor' from the context (Integral b) bound by the inferred type of listRestDiv :: Integral b => Integer -> b at

到此结束。我只是不明白这里的类型。 预先感谢您的任何提示。

实际收到的完整错误消息提示我们解决此问题。

Prelude> let listRestDiv n = floor(n/(fromInteger (nextPrimeDiv n)))

<interactive>:8:21:
    Could not deduce (RealFrac Integer) arising from a use of `floor'
    from the context (Integral b)
      bound by the inferred type of
               listRestDiv :: Integral b => Integer -> b
      at <interactive>:8:5-59
    Possible fix: add an instance declaration for (RealFrac Integer)
    In the expression: floor (n / (fromInteger (nextPrimeDiv n)))
    In an equation for `listRestDiv':
        listRestDiv n = floor (n / (fromInteger (nextPrimeDiv n)))

<interactive>:8:28:
    Could not deduce (Fractional Integer) arising from a use of `/'
    from the context (Integral b)
      bound by the inferred type of
               listRestDiv :: Integral b => Integer -> b
      at <interactive>:8:5-59
    Possible fix: add an instance declaration for (Fractional Integer)
    In the first argument of `floor', namely
      `(n / (fromInteger (nextPrimeDiv n)))'
    In the expression: floor (n / (fromInteger (nextPrimeDiv n)))
    In an equation for `listRestDiv':
        listRestDiv n = floor (n / (fromInteger (nextPrimeDiv n)))

这里要注意的重要一点是

    Possible fix: add an instance declaration for (Fractional Integer)
    In the first argument of `floor', namely
      `(n / (fromInteger (nextPrimeDiv n)))'

所以,你所要做的就是,对 n 使用 fromInteger,就像这样

Prelude> let listRestDiv n = floor(fromInteger n/(fromInteger (nextPrimeDiv n)))