一个新手并且在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实例。 我真的不明白......有人可以向我解释一下吗?
答案 0 :(得分:2)
显然,几乎所有数字的对数都是不合理的,因此使用fromIntegral
对你来说确实看起来很可疑。为什么你甚至认为你需要它?您需要的地方是之前对数,因为实际上仅接受 Floating
类的值,因为我们可以很容易地找到 1功能:
前奏> :t log
log :: Floating a => a - >一个
所以有必要成为e = round (log $ fromIntegral n)
。您根本不需要f
,因为2
只是一个通用的Num
字面值,而不是Int
。显然,round
只是log 2
是不对的,因为那只是1
。你可能想要的是round $ e / f
浮点e
和f
。
1 我不知道这是否适用于Hugs;大概。如果不是,请使用GHCi(为什么现在每个人似乎都会使用Hugs?我不知道为什么除了GHC之外你还会使用其他任何东西。)