SlideShare a Scribd company logo
Haskell

Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
?
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
1 public class Counter {
2
3     private int count = 0;
4
5     /**
6      *            .
 7       * @param value
 8       * @return
 9       */
10     public int up(int value) {
11          count += value;
12          return count;
13     }
14 }
1 public class Counter {
2
3     private int count = 0;
4
5     /**
6      *            .
 7       * @param value
 8       * @return
 9       */
10     public int up(int value) {
11          count += value;
12          return count;
13     }
14 }
1 import java.util.Scanner;
 2
 3 public class IOSample {
 4
 5   public static void main(String[] args) {
 6
 7     Scanner scan = new Scanner(System.in);
 8
 9     System.out.println("        ");
10       String str = scan.next(); //
11       System.out.println("           "+ str);
12   }
13 }


                        (         )
1 import java.util.Scanner;
 2
 3 public class IOSample {
 4
 5   public static void main(String[] args) {
 6
 7     Scanner scan = new Scanner(System.in);
 8
 9     System.out.println("        ");
10       String str = scan.next(); //
11       System.out.println("           "+ str);
12   }
13 }


                        (         )
Haskell
Concurrent Clean



     OCaml            Erlang
     Scala         Lisp(Scheme)
       F#
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
What's faster than C++, more concise than Perl,
more regular than Python, more flexible than Ruby,
more typeful than C#, more robust than Java,
and has absolutely nothing in common with PHP?
It's Haskell!
                            -- Autrijus Tang(    )
C++             Perl

Python                 Ruby

C#                            Java

PHP

Haskell
Haskellで学ぶ関数型言語
1   cond :: Bool
 2   cond = True
 3
 4   price :: Int
 5   price = 2800
 6
 7   pi :: Float
 8   pi = 3.141592653589793
 9
10   greeting :: String
11   greeting = "Hello, Haskell!"
12
13   letter :: Char
14   letter = 'C'
‘A’       ‘B’       ‘C’      ‘D’

1 bools = [True, False, True] :: [Bool]
2
3 -- "ABCD"
4 letters = ['A', 'B', 'C', 'D'] :: [Char]
5
6 --
7 empty = [] :: [Int]
8
9 --                1
10 notEmpty = [[]] :: [[Float]]
1 --
2 (False, 'A') :: (Bool, Char)
3
4 --        (          )
5 ("Name", True, 123) :: (String, Bool, Int)
6
7 --
 8 ('a', (False, 'b')) :: (Char, (Bool, Char))
 9
10 --
11 (['a', 'b', ‘c’], [False, True]) :: ([Char], [Bool])
12
13 --
14 [('a', False), ('b', True)] :: [(Char, Bool)]
1   double :: Int -> Int
2   double x = x + x
3
4   add :: (Int, Int) -> Int
5   add (x, y) = x + y
6
7   mult :: Int -> Int -> Int -> Int
8   mult x y z = x * y * z

> double 3
6
> add (1, 7)
8
> mult 7 8 9
504
1   add :: (Int, Int) -> Int
 2   add (x, y) = x + y
 3
 4   -- Int -> (Int -> Int)
                                   Haskell
 5   add' :: Int -> Int -> Int
 6   add' x y = x + y                        1
 7
 8   mult10 :: Int -> Int -> Int
 9   mult10 = mult 10
10
11   mult30 :: Int -> Int
12   mult30 = mult 10 3

> mult10 3 8
240
> mult30 5
150
1   twice :: (Int -> Int) -> Int -> Int
2   twice f x = f (f x)
3                                     Int
4   isDigit :: Char -> Bool
                                        Int
5   isDigit c = c >= '0' && c <= '9'
6
7   -- map :: (a -> b) -> [a] -> [b]

> twice (*2) 3
12
> map (+1) [1, 2, 3, 4]
[2, 3, 4, 5]
> map isDigit ['a', '0', 'b', '9']
[False, True, False, True]
> length [1, 3, 5, 7]
4
> length [True, False]
2
> length [length, length, length]
3


length :: [a] -> Int
map :: (a -> b) -> [a] -> [b]
> 1 + 2
3
> (*) 1.1 2.3        -- 1.1 * 2.3
2.53
> 10 `div` 2         -- div 10 2
5

 1   (+)      ::   Num   a   =>   a   ->   a -> a
 2   (*)      ::   Num   a   =>   a   ->   a -> a
 3   negate   ::   Num   a   =>   a   ->   a
 4   abs      ::   Num   a   =>   a   ->   a
1 --              (     Ord, Show, Read     )
2 class Eq a where
3    (==) :: a -> a -> Bool
4    (/=) :: a -> a -> Bool
5
6 --    MyType Eq
7 instance Eq MyType where
8   (MyType a) == (MyType a') = (a == a')
1 --          [λxy. x+y]
2   add x y = x + y
3   add' = x -> (y -> x + y)
4   add'' = x y -> x + y
5
6   --
7 -- const x y = x
 8 const :: a -> (b -> a)
 9 const x = _ -> x
10
11 --
> map (x -> x * 2 + 1) [1, 3, 5, 7]
[3, 7, 11, 15]
> [x^2 | x <- [1..5]]
[1,4,9,16,25]

> [(x, y) | x <- [1,2,3], y <- [4,5]]
[(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)]

1 --
2 factors :: Int -> [Int]
3 factors n = [x | x <- [1..n], n `mod` x == 0]
4 --
5 primes :: Int -> [Int]
6 primes n = [x | x <- [2..n], factors x == [1, x]]

> factors 100
[1,2,4,5,10,20,25,50,100]

> primes 50
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
1 --
2   factorial :: Int -> Int
3   factorial 0 = 1
4   factorial n = n * factorial (n - 1)
5
6   --
7 product :: Num a => [a] -> a
8 product []     = 1
9 product (n:ns) = n * product ns

    1        2        3        4
    1:[2,3,4]                  4:[]
1 qsort :: Ord a => [a] -> [a]
2 qsort []     = []
3 qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger
4     where
5         smaller = [a|a <- xs, a <= x]
6         larger = [a|a <- xs, a > x]

> qsort [100, 23, 37, 3, 55, 68, 49]
[3,23,37,49,55,68,100]
1   even :: Int -> Bool     even 4
2   even 0 = True          = {even       }
3   even n = odd (n - 1)
                            odd 3
4                          = {odd    }
5   odd :: Int -> Bool
                            even 2
6   odd 0 = False          = {even       }
7   odd n = even (n - 1)
                            odd 1
                           = {odd    }
> even 4
                            even 0
True                       = {even       }
> odd 4
                            True
False
Haskellで学ぶ関数型言語
1 --                                   !
2   summary :: [Integer] -> Integer
3   summary []     = 0
4   summary (n:ns) = n + summary ns
5
6   --               (         )
 7 summary' :: [Integer] -> Integer
 8 summary' xs = f xs 0
 9   where
10     f [] sum     = sum
11     f (y:ys) sum = f ys (y + sum)
mult (x, y) = x * y
         ?       > mult (1+2, 2+3)
                                           ?
 mult (1+2, 2+3)              mult (1+2, 2+3)
= {     +     }              = {mult     }
 mult (3, 2+3)                (1+2) * (2+3)
= {+     }                   = {     +     }
 mult (3, 5)                  3 * (2+3)
= {mult     }                = {+     }
 3 * 5                        3 * 5
= {*         }               = {*      }
 15                           15
inf :: Int
                  inf = 1 + inf



 fst (0, inf)               fst (0, inf)
= {inf     }               = {fst     }
 fst (0, 1+inf)             0
= {inf     }
 fst (0, 1+(1+inf))
= {inf     }
 fst (0, 1+(1+(1+inf)))
= {inf     }
         !!
1 ones :: [Int]
 2 ones = 1 : ones
 3
 4 --                       (                )
 5   sieve :: [Int] -> [Int]
 6   sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p /= 0]
 7
 8   primes :: [Int]
 9   primes = sieve [2..]        head ones
                                = {head          ones   }
> head ones                  head (1:ones)
1                           = {head     }
> take 10 primes             1
[2,3,5,7,11,13,17,19,23,29]
Mac OS X 10.7.1
tarai :: Int -> Int -> Int -> Int
                                           1.8 GHz Intel Core i7
tarai x y z
                                           4 GB 1333 MHz DDR3
  | x <= y = y
  | otherwise = tarai (tarai (x-1) y z)
                                           > tarai 16 10 0
                      (tarai (y-1) z x)
                                           16
                      (tarai (z-1) x y)
                             Haskell

private int tarai(int x, int y, int z) {
                                                 :107039ms
  if (x <= y) {
    return y;                                    :45,722,185,221
  } else {
    return tarai(tarai(x-1, y, z),
                 tarai(y-1, z, x),
                 tarai(z-1, x, y));
  }
}                              Java
Monad
Haskell
     (※   )
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
6 -- set1                    set2
 7   translate   :: String -> String ->   Char -> Char
 8   translate   []     _      c = c
 9   translate   (x:xs) []     c = if x   == c then ' ' else translate xs [] c
10   translate   (x:xs) [y]    c = if x   == c then y else translate xs [y] c
11   translate   (x:xs) (y:ys) c = if x   == c then y else translate xs ys c
12
13   --
14   translateString :: String -> String -> String -> String
15   translateString set1 set2 str = map (translate set1 set2) str
16
17   usage :: IOError -> IO ()
18   usage e = do putStrLn "Usage: ex14 set1 set2"
19                putStrLn "Translates characters in set1 on stdin to the corresponding"
20                putStrLn "characters from set2 and writes the translation to stdout."
21
22   --
23 main :: IO    ()
24 main = (do    [set1,set2] <- getArgs
25               contents    <- hGetContents stdin
26               putStr $ translateString set1 set2 contents) `catchError` usage
6 -- set1                    set2
 7   translate   :: String -> String ->   Char -> Char
 8   translate   []     _      c = c
 9   translate   (x:xs) []     c = if x   == c then ' ' else translate xs [] c
10   translate   (x:xs) [y]    c = if x   == c then y else translate xs [y] c
11   translate   (x:xs) (y:ys) c = if x   == c then y else translate xs ys c
12
13   --
14   translateString :: String -> String -> String -> String
15   translateString set1 set2 str = map (translate set1 set2) str
16
17   usage :: IOError -> IO ()
18   usage e = do putStrLn "Usage: ex14 set1 set2"
19                putStrLn "Translates characters in set1 on stdin to the corresponding"
20                putStrLn "characters from set2 and writes the translation to stdout."
21
22   --
23 main :: IO    ()
24 main = (do    [set1,set2] <- getArgs
25               contents    <- hGetContents stdin
26               putStr $ translateString set1 set2 contents) `catchError` usage
Monad
1   class Monad m where
 2     (>>=) :: m a -> (a -> m b) -> m b
 3     return :: a -> m a
 4
 5   -- data Bool = False | True
 6   data Maybe a = Nothing | Just a
 7
 8   instance Monad Maybe where
 9     return         = Just                  (         )
10     fail           = Nothing
11     Nothing >>= f = Nothing         Just       Nothing
12     (Just x) >>= f = f x             1

                                              Maybe Int
lookup :: Eq a => a -> [(a, b)] -> Maybe b

players = [(6, "Nakata"), (11, "Darvish"), (41, "Inaba")]

> lookup 11 players
Just "Darvish"

> lookup 212 players
Nothing
1 pacific = [("Fs", [(6, "Nakata"), (11, "Darvish"), (41, "Inaba")]),
2            ("SH", [(3, "Matsunaka"), (21, "Wada"), (47, "Sugiuchi")]),
3            ("Es", [(18, "Tanaka"), (21, "Iwakuma"), (32, "Matsui")])]
4
5 lookupName :: String -> Int -> Maybe String
6 lookupName t n = case (lookup t pacific) of
7                    Just players -> lookup n players
8                    Nothing      -> Nothing

> lookupName "Fs" 41
Just "Inaba"




                                                  …
--             (    )
class Monad m where
  (>>=) :: m a -> (a -> m b) -> m b
  return :: a -> m a

instance Monad Maybe where
  return         = Just
  fail           = Nothing
  Nothing >>= f = Nothing
  (Just x) >>= f = f x


     Nothing                      Maybe       Nothing
                   >>=   Int ->       ?   =

      Just                        Maybe       Maybe
      Int          >>=   Int ->       ?   =     ?
1   pacific = [("Fs", [(6, "Nakata"), (11, "Darvish"), (41, "Inaba")]),
 2              ("SH", [(3, "Matsunaka"), (21, "Wada"), (47, "Sugiuchi")]),
 3              ("Es", [(18, "Tanaka"), (21, "Iwakuma"), (32, "Matsui")])]
 4
 5   lookupName :: String -> Int -> Maybe String
 6   lookupName t n = case (lookup t pacific) of
 7                      Just players -> lookup n players
 8                      Nothing      -> Nothing
 9
10   lookupName' t n = lookup t pacific >>= lookup n

> lookupName' "Es" 18
Just "Tanaka"                                          [(Int, b)] -> Maybe b

> lookupName' "Fs" 18
Nothing                           Maybe [(Int, String)]

> lookupName' "DH" 21
Nothing
                             --
                             (>>=) :: m a -> (a -> m b) -> m b
                             lookup :: Eq a => a -> [(a, b)] -> Maybe b
Maybe                Maybe                Maybe                Mayb
 a      >>=   a ->    b      >>=   b ->    c      >>=   c ->    d
IO()     String -> IO()


main = putStrLn "Hello, World!"

main = let a = putStrLn "Hello" in (a >> a)



 IO a
IO String    String -> IO()

main = getContents >>= putStrLn

 IO        IO                   IO
()    =   Str    >>=   Str ->   ()
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語

More Related Content

Haskellで学ぶ関数型言語

  • 2.
  • 7. ?
  • 12. 1 public class Counter { 2 3 private int count = 0; 4 5 /** 6 * . 7 * @param value 8 * @return 9 */ 10 public int up(int value) { 11 count += value; 12 return count; 13 } 14 }
  • 13. 1 public class Counter { 2 3 private int count = 0; 4 5 /** 6 * . 7 * @param value 8 * @return 9 */ 10 public int up(int value) { 11 count += value; 12 return count; 13 } 14 }
  • 14. 1 import java.util.Scanner; 2 3 public class IOSample { 4 5 public static void main(String[] args) { 6 7 Scanner scan = new Scanner(System.in); 8 9 System.out.println(" "); 10 String str = scan.next(); // 11 System.out.println(" "+ str); 12 } 13 } ( )
  • 15. 1 import java.util.Scanner; 2 3 public class IOSample { 4 5 public static void main(String[] args) { 6 7 Scanner scan = new Scanner(System.in); 8 9 System.out.println(" "); 10 String str = scan.next(); // 11 System.out.println(" "+ str); 12 } 13 } ( )
  • 16. Haskell Concurrent Clean OCaml Erlang Scala Lisp(Scheme) F#
  • 19. What's faster than C++, more concise than Perl, more regular than Python, more flexible than Ruby, more typeful than C#, more robust than Java, and has absolutely nothing in common with PHP? It's Haskell! -- Autrijus Tang( ) C++ Perl Python Ruby C# Java PHP Haskell
  • 21. 1 cond :: Bool 2 cond = True 3 4 price :: Int 5 price = 2800 6 7 pi :: Float 8 pi = 3.141592653589793 9 10 greeting :: String 11 greeting = "Hello, Haskell!" 12 13 letter :: Char 14 letter = 'C'
  • 22. ‘A’ ‘B’ ‘C’ ‘D’ 1 bools = [True, False, True] :: [Bool] 2 3 -- "ABCD" 4 letters = ['A', 'B', 'C', 'D'] :: [Char] 5 6 -- 7 empty = [] :: [Int] 8 9 -- 1 10 notEmpty = [[]] :: [[Float]]
  • 23. 1 -- 2 (False, 'A') :: (Bool, Char) 3 4 -- ( ) 5 ("Name", True, 123) :: (String, Bool, Int) 6 7 -- 8 ('a', (False, 'b')) :: (Char, (Bool, Char)) 9 10 -- 11 (['a', 'b', ‘c’], [False, True]) :: ([Char], [Bool]) 12 13 -- 14 [('a', False), ('b', True)] :: [(Char, Bool)]
  • 24. 1 double :: Int -> Int 2 double x = x + x 3 4 add :: (Int, Int) -> Int 5 add (x, y) = x + y 6 7 mult :: Int -> Int -> Int -> Int 8 mult x y z = x * y * z > double 3 6 > add (1, 7) 8 > mult 7 8 9 504
  • 25. 1 add :: (Int, Int) -> Int 2 add (x, y) = x + y 3 4 -- Int -> (Int -> Int) Haskell 5 add' :: Int -> Int -> Int 6 add' x y = x + y 1 7 8 mult10 :: Int -> Int -> Int 9 mult10 = mult 10 10 11 mult30 :: Int -> Int 12 mult30 = mult 10 3 > mult10 3 8 240 > mult30 5 150
  • 26. 1 twice :: (Int -> Int) -> Int -> Int 2 twice f x = f (f x) 3 Int 4 isDigit :: Char -> Bool Int 5 isDigit c = c >= '0' && c <= '9' 6 7 -- map :: (a -> b) -> [a] -> [b] > twice (*2) 3 12 > map (+1) [1, 2, 3, 4] [2, 3, 4, 5] > map isDigit ['a', '0', 'b', '9'] [False, True, False, True]
  • 27. > length [1, 3, 5, 7] 4 > length [True, False] 2 > length [length, length, length] 3 length :: [a] -> Int map :: (a -> b) -> [a] -> [b]
  • 28. > 1 + 2 3 > (*) 1.1 2.3 -- 1.1 * 2.3 2.53 > 10 `div` 2 -- div 10 2 5 1 (+) :: Num a => a -> a -> a 2 (*) :: Num a => a -> a -> a 3 negate :: Num a => a -> a 4 abs :: Num a => a -> a
  • 29. 1 -- ( Ord, Show, Read ) 2 class Eq a where 3 (==) :: a -> a -> Bool 4 (/=) :: a -> a -> Bool 5 6 -- MyType Eq 7 instance Eq MyType where 8 (MyType a) == (MyType a') = (a == a')
  • 30. 1 -- [λxy. x+y] 2 add x y = x + y 3 add' = x -> (y -> x + y) 4 add'' = x y -> x + y 5 6 -- 7 -- const x y = x 8 const :: a -> (b -> a) 9 const x = _ -> x 10 11 -- > map (x -> x * 2 + 1) [1, 3, 5, 7] [3, 7, 11, 15]
  • 31. > [x^2 | x <- [1..5]] [1,4,9,16,25] > [(x, y) | x <- [1,2,3], y <- [4,5]] [(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)] 1 -- 2 factors :: Int -> [Int] 3 factors n = [x | x <- [1..n], n `mod` x == 0] 4 -- 5 primes :: Int -> [Int] 6 primes n = [x | x <- [2..n], factors x == [1, x]] > factors 100 [1,2,4,5,10,20,25,50,100] > primes 50 [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
  • 32. 1 -- 2 factorial :: Int -> Int 3 factorial 0 = 1 4 factorial n = n * factorial (n - 1) 5 6 -- 7 product :: Num a => [a] -> a 8 product [] = 1 9 product (n:ns) = n * product ns 1 2 3 4 1:[2,3,4] 4:[]
  • 33. 1 qsort :: Ord a => [a] -> [a] 2 qsort [] = [] 3 qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger 4 where 5 smaller = [a|a <- xs, a <= x] 6 larger = [a|a <- xs, a > x] > qsort [100, 23, 37, 3, 55, 68, 49] [3,23,37,49,55,68,100]
  • 34. 1 even :: Int -> Bool even 4 2 even 0 = True = {even } 3 even n = odd (n - 1) odd 3 4 = {odd } 5 odd :: Int -> Bool even 2 6 odd 0 = False = {even } 7 odd n = even (n - 1) odd 1 = {odd } > even 4 even 0 True = {even } > odd 4 True False
  • 36. 1 -- ! 2 summary :: [Integer] -> Integer 3 summary [] = 0 4 summary (n:ns) = n + summary ns 5 6 -- ( ) 7 summary' :: [Integer] -> Integer 8 summary' xs = f xs 0 9 where 10 f [] sum = sum 11 f (y:ys) sum = f ys (y + sum)
  • 37. mult (x, y) = x * y ? > mult (1+2, 2+3) ? mult (1+2, 2+3) mult (1+2, 2+3) = { + } = {mult } mult (3, 2+3) (1+2) * (2+3) = {+ } = { + } mult (3, 5) 3 * (2+3) = {mult } = {+ } 3 * 5 3 * 5 = {* } = {* } 15 15
  • 38. inf :: Int inf = 1 + inf fst (0, inf) fst (0, inf) = {inf } = {fst } fst (0, 1+inf) 0 = {inf } fst (0, 1+(1+inf)) = {inf } fst (0, 1+(1+(1+inf))) = {inf } !!
  • 39. 1 ones :: [Int] 2 ones = 1 : ones 3 4 -- ( ) 5 sieve :: [Int] -> [Int] 6 sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p /= 0] 7 8 primes :: [Int] 9 primes = sieve [2..] head ones = {head ones } > head ones head (1:ones) 1 = {head } > take 10 primes 1 [2,3,5,7,11,13,17,19,23,29]
  • 40. Mac OS X 10.7.1 tarai :: Int -> Int -> Int -> Int 1.8 GHz Intel Core i7 tarai x y z 4 GB 1333 MHz DDR3 | x <= y = y | otherwise = tarai (tarai (x-1) y z) > tarai 16 10 0 (tarai (y-1) z x) 16 (tarai (z-1) x y) Haskell private int tarai(int x, int y, int z) { :107039ms if (x <= y) { return y; :45,722,185,221 } else { return tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y)); } } Java
  • 41. Monad
  • 42. Haskell (※ )
  • 47. 6 -- set1 set2 7 translate :: String -> String -> Char -> Char 8 translate [] _ c = c 9 translate (x:xs) [] c = if x == c then ' ' else translate xs [] c 10 translate (x:xs) [y] c = if x == c then y else translate xs [y] c 11 translate (x:xs) (y:ys) c = if x == c then y else translate xs ys c 12 13 -- 14 translateString :: String -> String -> String -> String 15 translateString set1 set2 str = map (translate set1 set2) str 16 17 usage :: IOError -> IO () 18 usage e = do putStrLn "Usage: ex14 set1 set2" 19 putStrLn "Translates characters in set1 on stdin to the corresponding" 20 putStrLn "characters from set2 and writes the translation to stdout." 21 22 -- 23 main :: IO () 24 main = (do [set1,set2] <- getArgs 25 contents <- hGetContents stdin 26 putStr $ translateString set1 set2 contents) `catchError` usage
  • 48. 6 -- set1 set2 7 translate :: String -> String -> Char -> Char 8 translate [] _ c = c 9 translate (x:xs) [] c = if x == c then ' ' else translate xs [] c 10 translate (x:xs) [y] c = if x == c then y else translate xs [y] c 11 translate (x:xs) (y:ys) c = if x == c then y else translate xs ys c 12 13 -- 14 translateString :: String -> String -> String -> String 15 translateString set1 set2 str = map (translate set1 set2) str 16 17 usage :: IOError -> IO () 18 usage e = do putStrLn "Usage: ex14 set1 set2" 19 putStrLn "Translates characters in set1 on stdin to the corresponding" 20 putStrLn "characters from set2 and writes the translation to stdout." 21 22 -- 23 main :: IO () 24 main = (do [set1,set2] <- getArgs 25 contents <- hGetContents stdin 26 putStr $ translateString set1 set2 contents) `catchError` usage
  • 49. Monad
  • 50. 1 class Monad m where 2 (>>=) :: m a -> (a -> m b) -> m b 3 return :: a -> m a 4 5 -- data Bool = False | True 6 data Maybe a = Nothing | Just a 7 8 instance Monad Maybe where 9 return = Just ( ) 10 fail = Nothing 11 Nothing >>= f = Nothing Just Nothing 12 (Just x) >>= f = f x 1 Maybe Int
  • 51. lookup :: Eq a => a -> [(a, b)] -> Maybe b players = [(6, "Nakata"), (11, "Darvish"), (41, "Inaba")] > lookup 11 players Just "Darvish" > lookup 212 players Nothing
  • 52. 1 pacific = [("Fs", [(6, "Nakata"), (11, "Darvish"), (41, "Inaba")]), 2 ("SH", [(3, "Matsunaka"), (21, "Wada"), (47, "Sugiuchi")]), 3 ("Es", [(18, "Tanaka"), (21, "Iwakuma"), (32, "Matsui")])] 4 5 lookupName :: String -> Int -> Maybe String 6 lookupName t n = case (lookup t pacific) of 7 Just players -> lookup n players 8 Nothing -> Nothing > lookupName "Fs" 41 Just "Inaba" …
  • 53. -- ( ) class Monad m where (>>=) :: m a -> (a -> m b) -> m b return :: a -> m a instance Monad Maybe where return = Just fail = Nothing Nothing >>= f = Nothing (Just x) >>= f = f x Nothing Maybe Nothing >>= Int -> ? = Just Maybe Maybe Int >>= Int -> ? = ?
  • 54. 1 pacific = [("Fs", [(6, "Nakata"), (11, "Darvish"), (41, "Inaba")]), 2 ("SH", [(3, "Matsunaka"), (21, "Wada"), (47, "Sugiuchi")]), 3 ("Es", [(18, "Tanaka"), (21, "Iwakuma"), (32, "Matsui")])] 4 5 lookupName :: String -> Int -> Maybe String 6 lookupName t n = case (lookup t pacific) of 7 Just players -> lookup n players 8 Nothing -> Nothing 9 10 lookupName' t n = lookup t pacific >>= lookup n > lookupName' "Es" 18 Just "Tanaka" [(Int, b)] -> Maybe b > lookupName' "Fs" 18 Nothing Maybe [(Int, String)] > lookupName' "DH" 21 Nothing -- (>>=) :: m a -> (a -> m b) -> m b lookup :: Eq a => a -> [(a, b)] -> Maybe b
  • 55. Maybe Maybe Maybe Mayb a >>= a -> b >>= b -> c >>= c -> d
  • 56. IO() String -> IO() main = putStrLn "Hello, World!" main = let a = putStrLn "Hello" in (a >> a) IO a
  • 57. IO String String -> IO() main = getContents >>= putStrLn IO IO IO () = Str >>= Str -> ()

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n