【发布时间】:2018-10-04 10:34:28
【问题描述】:
为什么第一个是正确的而第二个不是? 我想以第二种方式实现代码,这样我就不必每次都调用fromInteger,但我不明白如何......
正确
bits :: Integer -> Int
bits 0 = 0
bits n = fromInteger n `mod` 2 + bits(fromInteger n `div` 2)
不正确
bits :: Integer -> Int
bits 0 = 0
bits n = let m = fromInteger n in m `mod` 2 + bits(m `div` 2)
【问题讨论】:
-
安全版本实际上是
bits n = fromInteger (n`mod`2) + bits (n`div`2)。或者case n`divMod`2 of (q,r) -> fromInteger r + bits q. -
调用
bits比简单调用fromInteger更好吗?除了使用更多的 CPU 周期之外,bits是fromInteger。您基本上是通过识别12 == 8 + 4将12 :: Integer转换为12 :: Int,然后添加8和4以返回12。