Target
Output horizontal edge image.Program
import System.IO import System.Environment (getArgs) -- Calculation with difference between previous value calcEdge :: [Int] -> [Int] calcEdge [] = [] calcEdge (x:y:zs) = if (x-y) < 0 then (0 : (calcEdge (y:zs))) else ((x-y) : (calcEdge (y:zs))) calcEdge (x:xs) = x : xs main = do args <- getArgs if length args <= 1 then do print "usage : ./pgm-input input.pgm output.pgm" else do infile <- openFile (head args) ReadMode -- Read PGM Header pgm_type <- hGetLine infile pgm_comment <- hGetLine infile pgm_max_brightness <- hGetLine infile pgm_size <- hGetLine infile -- Read PGM Pixels- pixels_handle <- hGetContents infile let src_contents = take (length pixels_handle) $ pixels_handle let src_contents_lines = lines src_contents let src_pixels = concat (map (\x -> words x) src_contents_lines) let int_pixels = map (\x -> read x::Int) src_pixels let dist_pixels = calcEdge int_pixels -- Output PGM File fh <- openFile (args !! 1) WriteMode hPutStrLn fh pgm_type hPutStrLn fh pgm_comment hPutStrLn fh pgm_max_brightness hPutStrLn fh pgm_size hPutStr fh ((foldr (\x xs -> show(x) ++ " " ++ xs ) "") dist_pixels) hClose infile hClose fh