Почему деление дает отрицательное число?
Почему при этом печатается отрицательное число -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 ответа:
Потому что вы говорите ему отрицательное число (предполагая, что вы используете 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
.Это хорошая причина для использования явных сигнатур типов.