Haskell类型转换错误

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)

一个新手,在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))
不知怎的,我知道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以外的任何东西)