module Main where import System.Environment usage = "Euler sum. I need 1 Parameter \"n\"::Int to tell you the Euler sum from 1 to n" main = do args <- getArgs if length args < 1 then putStrLn usage else putStrLn (show $ sumEuler (read (args !! 0))) mapReduce :: (a -> b) -> (b -> b -> b) -> b -> [a] -> b mapReduce mapF redF neutral list = foldl redF neutral (map mapF list) sumEuler :: Int -> Int sumEuler n = mapReduce phi (+) 0 [1..n] phi :: Int -> Int phi n = length (filter (relprime n) [1..(n-1)]) --alternative gcd in Prelude hcf :: Int -> Int -> Int hcf x 0 = x hcf x y = hcf y (rem x y) relprime :: Int -> Int -> Bool relprime x y = hcf x y == 1