为什么分部产生负数?

时间:2013-10-15 23:44:55

标签: haskell integer prime-factoring

为什么打印的负数为-147982099而不是8462696833 = 600851475143/71

import Data.List

smallFactor n = case (elemIndex 0 (map (mod n) [2..])) of
                    Just x -> x + 2

main = print( quot n (smallFactor n) )
    where n = 600851475143

完整输出:

$ ghc --make p3; ./p3
[1 of 1] Compiling Main             ( p3.hs, p3.o )
Linking p3 ...
-147982099

2 个答案:

答案 0 :(得分:11)

因为你告诉它一个负数(假设你使用的是32位GHC)。

where n = 600851475143 -- n = -443946297

通知:

Prelude Data.Int> 600851475143 :: Int32
-443946297

答案 1 :(得分:11)

当可以自由选择要使用的整数类型时,Haskell通常默认为Integer。但在这里我们看到Int。原因是:

elemIndex :: Eq a => a -> [a] -> Maybe Int

因此x Just x -> x + 2Int,这意味着smallFactor必须返回Int,这意味着n位于main 1}}必须是Int,因为quot :: Integral a => a -> a -> a

这是使用显式类型签名的一个很好的理由。