import Math import System.Environment import Data.List import Text.Printf errorMessage :: String -> String errorMessage "" = "nd v1\nUsage: nd [-help, -int, -prime, -factor, -hcf]\n" errorMessage reason = "nd v1\nFAILURE: " ++ reason ++ "\nUsage: nd [-int, -prime, -factor, -hcf]\n" flagHandlerF :: [String] -> Int -> String -> ([String] -> String) -> String flagHandlerF args (-1) error fmessage = if (length args) == 0 then error else fmessage args flagHandlerF args nargs error fmessage = if (length args) /= nargs then error else fmessage args flagHandler :: String -> [String] -> String flagHandler "-prime" args = flagHandlerF args (-1) (errorMessage "-prime requires at least one integer argument") (\args -> foldl (++) "" [show y ++ ": isPrime=" ++ (show $ isPrime y) ++ "\n" | x <- args, let y = (read x) :: Int]) flagHandler "-factor" args = flagHandlerF args (-1) (errorMessage "-factor requires at least one integer argument") (\args -> foldl (++) "" [show y ++ ": factors=" ++ show (factors $ y) | x <- args, let y = (read x) :: Int]) flagHandler "-int" args = flagHandlerF args (-1) (errorMessage "-int requires at least one integer argument") (\args -> foldl (++) "" [show y ++ ": (isPrime=" ++ (show $ isPrime y) ++ ", factors=" ++ (show $ factors y) ++ ")\n" | x <- args, let y = (read x) :: Int]) flagHandler "-hcf" args = flagHandlerF args (2) (errorMessage "-hcf requires two integer arguments") (\args -> let n = (read $ head args) :: Int m = (read $ head $ tail args) :: Int hcf = head $ reverse $ intersect (factors n) (factors m) in "hcf(" ++ show n ++ ", " ++ show m ++ "): hcf=" ++ show hcf) flagHandler _ _ = errorMessage "Flag not recognised" main = do args <- getArgs putStr $ case args of [] -> errorMessage "" (x: xs) -> if x == "-help" then errorMessage "" else flagHandler x xs