Почему деление дает отрицательное число?


Почему при этом печатается отрицательное число -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 5

2 ответа:

Потому что вы говорите ему отрицательное число (предполагая, что вы используете 32-битный GHC).

where n = 600851475143 -- n = -443946297

Примечание:

Prelude Data.Int> 600851475143 :: Int32
-443946297

Haskell обычно по умолчанию принимает значение Integer, когда имеется свободный выбор интегрального типа для использования. Но здесь мы видим Int. И причина в следующем:

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

Таким образом, x в Just x -> x + 2 является Int, что означает, что smallFactor должен возвращать Int, что означает, что n в main должен быть Int, потому что quot :: Integral a => a -> a -> a.

Это хорошая причина для использования явных сигнатур типов.