1 2 3 4 printChar 5 printChar 6 printChar xs = [printChar - - PowerPoint PPT Presentation

1 2 3 4
SMART_READER_LITE
LIVE PREVIEW

1 2 3 4 printChar 5 printChar 6 printChar xs = [printChar - - PowerPoint PPT Presentation

1 2 3 4 printChar 5 printChar 6 printChar xs = [printChar a, printChar b] printChar 7 8 9 type IO = World -> World type IO a = World -> (a, World) b -> World -> (a, World) 10 IO a IO Char IO ()


slide-1
SLIDE 1

1

slide-2
SLIDE 2

2

slide-3
SLIDE 3

3

slide-4
SLIDE 4

4

slide-5
SLIDE 5

5

printChar

slide-6
SLIDE 6

6

printChar

slide-7
SLIDE 7

7

printChar xs = [printChar ’a’, printChar ’b’]

printChar

slide-8
SLIDE 8

8

slide-9
SLIDE 9

9

slide-10
SLIDE 10

10

type IO = World -> World type IO a = World -> (a, World) b -> World -> (a, World)

slide-11
SLIDE 11

11

IO a IO Char IO ()

slide-12
SLIDE 12

12

getChar :: IO Char putChar :: Char -> IO () return :: a -> IO a

slide-13
SLIDE 13

13

(>>=) :: IO a -> (a -> IO b) -> IO b (act1 >>= act2) = \world -> case act1 world of (v, world’) -> act2 v world’ (>>) :: IO a -> IO b -> IO b (act1 >> act2) = \world -> case act1 world of (v, world’) -> act2 world’

slide-14
SLIDE 14

14

getLine :: IO String getLine = getChar >>= \x -> if x == ‘\n’ then return [] else (getLine >>= \xs -> return (x:xs))

  • putStr :: String → IO ()

putStr [] = return () putStr (x:xs) = putChar x >> putStr xs

  • putStrLn :: String → IO ()

putStrLn xs = putStr xs >> putChar '\n'

slide-15
SLIDE 15

15

getLine :: IO String getLine = do x <- getChar if x == ‘\n’ then return [] else do xs <- getLine return (x:xs)

  • putStr :: String → IO ()

putStr [] = return () putStr (x:xs) = do putChar x putStr xs

  • putStrLn :: String → IO ()

putStrLn xs = do putStr xs putChar ‘\n’

slide-16
SLIDE 16

16

strlen :: IO () strlen = putStr "Enter a string: ” >> getLine >>= \xs -> putStr "The string has ” >> putStr (show (length xs)) >> putStrLn " characters."

slide-17
SLIDE 17

17

strlen :: IO () strlen = do putStr “Enter a string: ” xs <- getLine putStr “The string has ” putStr (show (length xs)) putStrLn “ characters.”

slide-18
SLIDE 18

18

return :: a -> IO a (>>=) :: IO a -> (a -> IO b) -> IO b getChar :: IO Char putChar :: Char -> IO ()

  • penFile :: [Char] -> IOMode -> IO Handle
  • return

<-

slide-19
SLIDE 19

19

main :: IO () main = getLine >>= \cs -> putLine (reverse cs)

slide-20
SLIDE 20

20

slide-21
SLIDE 21

21

slide-22
SLIDE 22

22

slide-23
SLIDE 23

23

f :: a -> Maybe b -- returns Just b or Nothing data Maybe a = Nothing | Just a

slide-24
SLIDE 24

24

doQuery :: Query -> DB -> Maybe Record r :: Maybe Record r = case doQuery q1 db of Nothing -> Nothing Just r1 -> case doQuery (q2 r1) db of Nothing -> Nothing Just r2 -> case doQuery (q3 r2) db of Nothing -> Nothing Just r3 -> . . .

slide-25
SLIDE 25

25

thenMB :: Maybe a -> (a -> Maybe b) -> Maybe b mB `thenMB` f = case mB of Nothing -> Nothing Just a -> f a r :: Maybe Record r = doQuery q1 db `thenMB` \r1 -> doQuery (q2 r1) db `thenMB` \r2 -> doQuery (q3 r2) db `thenMB` . . .

slide-26
SLIDE 26

26

(>>=) :: [a] -> (a -> [b]) -> [b] concatMap :: (a -> [b]) -> [a] -> [b] instance Monad [] where m >>= f = concatMap f m return x = [x]

slide-27
SLIDE 27

27

slide-28
SLIDE 28

28

return :: a -> M a (>>=) :: M a -> (a -> M b) -> M b return x >>= f == f x -- left identity m >>= return == m -- right identity (m >>= f) >>= g == m >>= (\x -> f x >>= g) -- associativity

slide-29
SLIDE 29

29

do { x’ <- return x; f x’ == do { f x } }

slide-30
SLIDE 30

30

do { x <- m; return x == do { m } }

slide-31
SLIDE 31

31

do { y <- do { x <- m; == do { x <- m; f x y <- f x; } g y g y } }

slide-32
SLIDE 32

32

class Monad m where >>= :: m a -> (a -> m b) -> m b >> :: m a -> m b -> m b return :: a -> m a m >> k = m >>= \_ -> k data Maybe a = Just a | Nothing thenMB :: Maybe a -> (a -> Maybe b) -> Maybe b instance Monad Maybe where (>>=) = thenMB return a = Just a

slide-33
SLIDE 33

33

class Monad m where >>= :: m a -> (a -> m b) -> m b >> :: m a -> m b -> m b return :: a -> m a m >> k = m >>= \_ -> k sequence :: Monad m => [m a] -> m [a] sequence [] = return [] sequence (c:cs) = c >>= \x -> sequence cs >>= \xs -> return (x:xs)

slide-34
SLIDE 34

34