-- | Input/Output in Haskell -- Examples to introduce and illustrate how I/O works in Haskell -- Functional Programming course 2017. -- Thomas Hallgren {- This started as a skeleton, the definitions were filled in during the lecture. -} import Data.List(sort) main = showTheDifference2 -- | Read two numbers x & y and show the difference x-y showTheDifference1 :: IO () showTheDifference1 = do putStrLn "Enter two numbers:" x <- readLn y <- readLn putStr "The difference is: " print (x-y) -- | Using 'return' to return results from IO actions getTheDifference :: IO Integer getTheDifference = do putStrLn "Enter two numbers:" x <- readLn y <- readLn return (x-y) -- | Reimplementation of showTheDifference1, using getTheDifference showTheDifference2 :: IO () showTheDifference2 = do n <- getTheDifference putStr "The difference is: " print n -- | Copy a file copyFile :: FilePath -> FilePath -> IO () copyFile from to = do text <- readFile from writeFile to text -- | Sort the lines in a text file sortFile :: FilePath -> FilePath -> IO () sortFile from to = do text <- readFile from let sorted = sortLines text writeFile to sorted sortLines = unlines . sort . lines doTwice :: IO a -> IO (a,a) doTwice io = do x <- io y <- io return (x,y) don't :: IO a -> IO () don't io = do putStrLn "Hello" return () -- | Reimplementation of getTheDifference, using doTwice getTheDifference2 :: IO Integer getTheDifference2 = do putStrLn "Enter two numbers:" (x,y) <- doTwice readLn return (x-y) -- | An example of combining do blocks and recursion to print some numbers numbers :: Int -> IO () numbers 0 = return () numbers n = do print n numbers (n-1)