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

PDF
Haskell超入門 Part.1
PDF
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
PPTX
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
PDF
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
PDF
組み込み関数(intrinsic)によるSIMD入門
PDF
Intro to SVE 富岳のA64FXを触ってみた
PDF
リアルタイムレイトレーシング時代を生き抜くためのデノイザー開発入門
PDF
20210515 of4 wi&amp;paraview 5.9.0_motorbike
Haskell超入門 Part.1
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
組み込み関数(intrinsic)によるSIMD入門
Intro to SVE 富岳のA64FXを触ってみた
リアルタイムレイトレーシング時代を生き抜くためのデノイザー開発入門
20210515 of4 wi&amp;paraview 5.9.0_motorbike

What's hot (20)

PDF
クロージャデザインパターン
PDF
ROS2勉強会 4章前半
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
PDF
AndroidとSELinux
PDF
CPUの同時実行機能
PDF
리눅스 커널 디버거 KGDB/KDB
PPTX
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
PDF
一人でもNFC開発
PDF
『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegorithmic』私家訳版
PPTX
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
PDF
【Unity道場 2月】シェーダを書けるプログラマになろう
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
PDF
UE4における大規模背景制作事例 最適化ワークフロー編
PDF
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
PDF
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
PDF
Rust で RTOS を考える
PPTX
なぜなにリアルタイムレンダリング
PPTX
Python / BlueprintによるUnreal Engineの自動化 / GTMF2019
PDF
Serf / Consul 入門 ~仕事を楽しくしよう~
PDF
Dockerfileを改善するためのBest Practice 2019年版
クロージャデザインパターン
ROS2勉強会 4章前半
C++でCプリプロセッサを作ったり速くしたりしたお話
AndroidとSELinux
CPUの同時実行機能
리눅스 커널 디버거 KGDB/KDB
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
一人でもNFC開発
『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegorithmic』私家訳版
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
【Unity道場 2月】シェーダを書けるプログラマになろう
いまさら聞けないarmを使ったNEONの基礎と活用事例
UE4における大規模背景制作事例 最適化ワークフロー編
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
シェーダーを活用した3Dライブ演出のアップデート ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スクスタ)の開発事例~​
Rust で RTOS を考える
なぜなにリアルタイムレンダリング
Python / BlueprintによるUnreal Engineの自動化 / GTMF2019
Serf / Consul 入門 ~仕事を楽しくしよう~
Dockerfileを改善するためのBest Practice 2019年版
Ad

Viewers also liked (16)

PDF
Petrobras cascade-chinook
PDF
5分で分かるgitのrefspec
PDF
JavaScriptの落とし穴
PPTX
Fun with Social, Windows 8 and Javascript
PPTX
Building your first Windows Phone 7 application for SharePoint
PPTX
The Connected Company - Event Anders Vergaderen
PPTX
Everything you always wanted to know about SharePoint 2013 Search relevance
PPTX
Intro to MUI and variations in SharePoint 2010
PPTX
Apps for Office Introduction
PPTX
Yammer Social Data Mining
PPTX
Building search-driven Windows 8 and Windows Phone 8 apps for SharePoint Serv...
PPTX
Claim Based Authentication in SharePoint 2010 for Community Day 2011
PPTX
The future of business process apps - a Microsoft perspective
PPTX
Exploring search driven applications with SharePoint 2013
PDF
What’s new on the Microsoft Azure Data Platform
PPTX
SharePoint Server 2013 : The big five
Petrobras cascade-chinook
5分で分かるgitのrefspec
JavaScriptの落とし穴
Fun with Social, Windows 8 and Javascript
Building your first Windows Phone 7 application for SharePoint
The Connected Company - Event Anders Vergaderen
Everything you always wanted to know about SharePoint 2013 Search relevance
Intro to MUI and variations in SharePoint 2010
Apps for Office Introduction
Yammer Social Data Mining
Building search-driven Windows 8 and Windows Phone 8 apps for SharePoint Serv...
Claim Based Authentication in SharePoint 2010 for Community Day 2011
The future of business process apps - a Microsoft perspective
Exploring search driven applications with SharePoint 2013
What’s new on the Microsoft Azure Data Platform
SharePoint Server 2013 : The big five
Ad

Similar to Haskellで学ぶ関数型言語 (20)

ZIP
Start Haskell 1st (Chapter 4)
PDF
Introduction to Haskell@Open Source Conference 2007 Hokkaido
PDF
01. haskell introduction
KEY
An Introduction to Functional Programming using Haskell
PDF
From Ruby to Haskell (Kansai Yami RubyKaigi)
KEY
Programming haskell chapter10
PDF
Haskell - Being lazy with class
PPTX
บทที่ 3 พื้นฐานภาษา Java
PDF
Why Haskell Matters
PDF
Peyton jones-2011-type classes
PDF
Plc (1)
PDF
Monadologie
PDF
110617 lt
PDF
High Wizardry in the Land of Scala
PDF
関数型プログラミングの世界
KEY
Five Languages in a Moment
PDF
Scala by Luc Duponcheel
PDF
変数の型 - Java 演習
PDF
Advanced Topics in Haskell
Start Haskell 1st (Chapter 4)
Introduction to Haskell@Open Source Conference 2007 Hokkaido
01. haskell introduction
An Introduction to Functional Programming using Haskell
From Ruby to Haskell (Kansai Yami RubyKaigi)
Programming haskell chapter10
Haskell - Being lazy with class
บทที่ 3 พื้นฐานภาษา Java
Why Haskell Matters
Peyton jones-2011-type classes
Plc (1)
Monadologie
110617 lt
High Wizardry in the Land of Scala
関数型プログラミングの世界
Five Languages in a Moment
Scala by Luc Duponcheel
変数の型 - Java 演習
Advanced Topics in Haskell

Recently uploaded (20)

PDF
Basic Mud Logging Guide for educational purpose
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
Classroom Observation Tools for Teachers
PPTX
master seminar digital applications in india
PPTX
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
PDF
STATICS OF THE RIGID BODIES Hibbelers.pdf
PPTX
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
PPTX
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
PPTX
Cell Types and Its function , kingdom of life
PDF
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
PDF
Complications of Minimal Access Surgery at WLH
PPTX
Cell Structure & Organelles in detailed.
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PDF
01-Introduction-to-Information-Management.pdf
PDF
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
PDF
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
PDF
Anesthesia in Laparoscopic Surgery in India
PDF
RMMM.pdf make it easy to upload and study
PDF
102 student loan defaulters named and shamed – Is someone you know on the list?
Basic Mud Logging Guide for educational purpose
O7-L3 Supply Chain Operations - ICLT Program
Classroom Observation Tools for Teachers
master seminar digital applications in india
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
STATICS OF THE RIGID BODIES Hibbelers.pdf
BOWEL ELIMINATION FACTORS AFFECTING AND TYPES
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
Cell Types and Its function , kingdom of life
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
Complications of Minimal Access Surgery at WLH
Cell Structure & Organelles in detailed.
O5-L3 Freight Transport Ops (International) V1.pdf
human mycosis Human fungal infections are called human mycosis..pptx
01-Introduction-to-Information-Management.pdf
Origin of periodic table-Mendeleev’s Periodic-Modern Periodic table
3rd Neelam Sanjeevareddy Memorial Lecture.pdf
Anesthesia in Laparoscopic Surgery in India
RMMM.pdf make it easy to upload and study
102 student loan defaulters named and shamed – Is someone you know on the list?

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