Haskell类型转换错误

时间:2013-11-30 21:13:37

标签: 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))

不知怎的,我知道e和f部分有些可疑......错误说:执行此函数需要小数Int实例。 我真的不明白......有人可以向我解释一下吗?

1 个答案:

答案 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浮点ef


1 我不知道这是否适用于Hugs;大概。如果不是,请使用GHCi(为什么现在每个人似乎都会使用Hugs?我不知道为什么除了GHC之外你还会使用其他任何东西。)