5

为什么这打印负数 -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
4

2 回答 2

11

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

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

所以xinJust x -> x + 2是一个Int,这意味着smallFactor必须返回一个Int,这意味着ninmain必须是一个Int因为quot :: Integral a => a -> a -> a

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

于 2013-10-16T00:36:42.827 回答
11

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

where n = 600851475143 -- n = -443946297

注意:

Prelude Data.Int> 600851475143 :: Int32
-443946297
于 2013-10-15T23:52:23.597 回答