
Please explain why this fails for negative numbers. By fails I mean it starts eating RAM infinitely until either me or OOM kills it. If you replace `m1` definition with the one commented out, the code will fail for positive integers as well, which is very frustrating. import System.Environment isPrime :: Int -> (Bool, String) isPrime n = let ll n = k + 1 : k + 5 : ll (n + 1) where k = 6 * n + 1 l = 2 : 3 : 5 : ll 1 q (i:is) | i * i > n = (True, "it is") | (n `rem` i) == 0 = (False, "divisible by " ++ show i) | otherwise = q is in q l main = getArgs >>= \argv -> let f True = "primal" f False = "not primal" m0 = map (\x -> read x :: Int) argv m1 = m0 --m1 = -- map -- (\x -> -- if x < 0 -- then -x -- else x) -- m0 m2 = map isPrime m1 msg (x, (y0, y1)) = x ++ " is " ++ f y0 ++ " because " ++ y1 in mapM_ putStrLn $ map msg (zip argv m2)