Haskell Chapter 9 More Input and More Output Files and Streams Transforming Input Not covered brackets command-line arguments bytestrings Transforming input Common pattern: get string from input, transform, output result Use interact main = interact shortLinesOnly shortLinesOnly :: String -> String shortLinesOnly = unlines . filter (\line -> length line < 10) . lines Quick Ex: Look up lines, unlines Another example respondPalindromes :: String -> String respondPalindromes = unlines . map (\xs -> if isPal xs then "palindrome" else "not a palindrome") . lines isPal :: String -> Bool isPal xs = xs == reverse xs main2 = interact respondPalindromes Reading a file import System.IO main3 = do handle <- openFile "haiku.txt" ReadMode contents <- hGetContents handle putStr contents putStr "\n" hClose handle openFile :: FilePath -> IOMode -> IO Handle type FilePath = String data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode Reading a file – simpler import System.IO main4 = do contents <- readFile "haiku.txt" putStr contents putStr "\n" readFile :: FilePath -> String -> IO() Randomness Referential transparency: function given the same parameters twice must return same result SO, we bring in randomness from outside (like using Unix time stamp for a seed) Take a random generator, return a random value and new random generator random : : (RandomGen g, Random a) => g -> (a, g) Take an integer, return a random generator mkStdGen :: Int -> StdGen * more random functions in book Example import System.Random threeCoins :: StdGen -> (Bool, Bool, Bool) threeCoins gen = let (firstCoin, newGen) = random gen (secondCoin, newGen') = random newGen (thirdCoin, newGen'') = random newGen' in (firstCoin, secondCoin, thirdCoin) --threeCoins (mkStdGen 22)