Slide 1

Slide 1 text

IO in Haskell Dr. Heinrich Hördegen hoerdegen@energiefluss.info 19. Januar 2014

Slide 2

Slide 2 text

Basic IO in Haskell In Haskell all IO action must take place in the IO monad. action :: IO () action = do putStr "Type something: " line <- getLine putStrLn line The type IO a means: When executing this IO action, we get back something of type a. Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 2 / 10

Slide 3

Slide 3 text

Is getLine a function? After all, getLine returns every time something different. . . Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 3 / 10

Slide 4

Slide 4 text

Is getLine a function? After all, getLine returns every time something different. . . But if you think of IO a as type IO a = RealWorld -> (a, RealWorld) then getLine could be just a function like any other function: action :: IO String action world0 = let (a, world1) = getLine world0 (b, world2) = getLine world1 in (a ++ "\n" ++ b, world2) That’s what the IO monad handles for you! Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 3 / 10

Slide 5

Slide 5 text

How to access intermediate results? Build lazy data structures with intermediate results. Instead of f :: Int -> Int define something like f :: Int -> [Int] Then, define your original function as func :: Int -> Int func x = last (f x) For debugging, you can use f. Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 4 / 10

Slide 6

Slide 6 text

IO Actions are First Class You can build IO actions in non IO code. readOnlyFromTmp :: FilePath -> Maybe (IO ()) readOnlyFromTmp fileName = if "/tmp/" ‘isPrefixOf‘ fileName then Just $ do str <- readFile fileName putStrLn str else Nothing Useful for building closures. Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 5 / 10

Slide 7

Slide 7 text

A Word on Syntax I main = do putStrLn "sometext" equals main = putStrLn "sometext" Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 6 / 10

Slide 8

Slide 8 text

A Word on Syntax I main = do putStrLn "sometext" equals main = putStrLn "sometext" main = do let str = "sometext" putStrLn str equals main = let str = "sometext" in putStrLn str Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 6 / 10

Slide 9

Slide 9 text

A Word on Syntax II main = do putStrLn "sometext1" putStrLn "sometext2" equals main = putStrLn "sometext1" >> putStrLn "sometext2" Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 7 / 10

Slide 10

Slide 10 text

A Word on Syntax II main = do putStrLn "sometext1" putStrLn "sometext2" equals main = putStrLn "sometext1" >> putStrLn "sometext2" main = do str <- readFile "file.txt" putStrLn str equals main = readFile "file.txt" >>= putStrLn Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 7 / 10

Slide 11

Slide 11 text

And don’t you ever try this ... case getLine of IO line -> line It just won’t work! Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 8 / 10

Slide 12

Slide 12 text

Is IO in Haskell pure? Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 9 / 10

Slide 13

Slide 13 text

Is IO in Haskell pure? For further explanation, look here: http://www.haskell.org/haskellwiki/IO_inside #Haskell_is_a_pure_language Have a look at our Munich Haskell Meeting: http://www.haskell-munich.de/ Ingenieurbüro Guttenberg & Hördegen () Energieflussanalyse 9 / 10

Slide 14

Slide 14 text

Thanks for your attention! hoerdegen@energiefluss.info www.energiefluss.info