缺少某个 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)))
在 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)))