Haskell类型转换错误
一个新手,在winHugs Haskell中编写了这段代码,以检查可导出的最大指数k,即2次方k是n的除数:Haskell类型转换错误,haskell,Haskell,一个新手,在winHugs Haskell中编写了这段代码,以检查可导出的最大指数k,即2次方k是n的除数: maxexp2 ::Int -> Int maxexp2 n | n==0 || 2^k`mod`n /= 0 = 0 | otherwise == k where k = e `div` f e = round (fromIntegral(log n)) f = round (fromIntegral (log 2)
maxexp2 ::Int -> Int
maxexp2 n
| n==0 || 2^k`mod`n /= 0 = 0
| otherwise == k
where k = e `div` f
e = round (fromIntegral(log n))
f = round (fromIntegral (log 2))
不知怎的,我知道e和f部分有些可疑……错误是:执行此函数需要分数Int实例。
我真的不明白……有人能给我解释一下吗?显然,几乎所有数字的对数都是无理的,所以在上面使用
from integral
对你来说确实有点可疑。为什么你认为在这一点上你需要它?需要它的地方是在对数之前,因为它实际上也只接受Floating
类的值,我们可以很容易地找到1:
序曲>:t log日志::浮动a=>a->a 所以它应该是
e=round(log$from整数n)
。对于f
您根本不需要它,因为2
只是一个泛型Num
文本,而不是Int
。不过,显然,只对日志2进行round
是不对的,因为这只是1
。您可能需要的是使用浮点e
和f
对$e/f进行四舍五入
1我不知道这是否适用于拥抱;可能如果没有,使用GHCi(为什么现在每个新来的人似乎都使用拥抱?我不知道为什么你会使用GHC以外的任何东西)