Slide 1

Slide 1 text

ݍ࿦ͱHaskell Ӊࠤݟ ެี ୈ̎ճ ؔ੢೔༵਺ֶ ༑ͷձ

Slide 2

Slide 2 text

ࣗݾ঺հ • Ӊࠤݟ ެีʢ͏͞Έ ͜͏͚͢ʣ • twitter: @usamik26 / connpass: usami-k • େֶ࣌୅͸਺ֶઐ߈ • Ͱ΋ݍ࿦͸΄ͱΜͲ΍ͬͯͳ͍ • ຊ৬͸ϓϩάϥϚʢϑΣϯϦϧגࣜձࣾʣ • Ͱ΋Haskell͸࢖ͬͯͳ͍

Slide 3

Slide 3 text

ݍ࿦ͱHaskell • ݍ࿦͸਺ֶཧ࿦ͷͻͱͭ • ࣸ૾ʹண໨ͨ͠ந৅୅਺࿦ • Haskell͸ϓϩάϥϛϯάݴޠͷͻͱͭ • ୅දతͳΞϓϦͱͯ͠ Pandoc ͳͲ͕͋Δ • ݴޠઃܭͱͯ͠ݍ࿦Λҙ͍ࣝͯ͠Δ

Slide 4

Slide 4 text

ݍʢCategoryʣ

Slide 5

Slide 5 text

ݍͷఆٛ • ର৅ , , , ... • ࣹ • ࣹͷ߹੒ ʢ͜͜Ͱ , ʣ • ݁߹཯ • ߃౳ࣹ ʢ೚ҙͷର৅ ʹ͍ͭͯଘࡏ͢Δʣ • ୯Ґݩ

Slide 6

Slide 6 text

ྫɿର৅͕;ͨͭͷݍ

Slide 7

Slide 7 text

(1) ର৅ؒͷࣹ͕ͳ͍ʢ߃౳ࣹ͚ͩʣ • ͜Ε͸ݍʹͳ͍ͬͯΔʢ߹੒Մೳͳࣹ͸ͳ͍ʣ

Slide 8

Slide 8 text

(2) ର৅ؒͷࣹ͕ͻͱͭ • ͜Ε͸ݍʹͳ͍ͬͯΔ

Slide 9

Slide 9 text

(3) ର৅ؒͷࣹ͕;ͨͭɿͦͷ1 • ͜Ε͸ݍʹͳ͍ͬͯΔʢ ʣ

Slide 10

Slide 10 text

(4) ର৅ؒͷࣹ͕;ͨͭɿͦͷ2 • ͜Ε͸ݍʹͳ͍ͬͯΔʢ ͷࣹ͕ෳ਺͋ͬͯ΋໰୊ͳ͍ʣ

Slide 11

Slide 11 text

(5) ର৅ؒͷࣹ͕Έͬͭʁʁ • ͜Μͳݍ͸ͳ͍ʢͦΕ͸ͳͥͰ͠ΐ͏͔ʁʣ

Slide 12

Slide 12 text

(5) ର৅ؒͷࣹ͕Έͬͭʁʁ • ͱ ʹ஫ҙ͢ΔɿͳͥͳΒɺͦΕʹ૬౰ ͢Δࣹ͕ଞʹଘࡏ͠ͳ͍͔Β ͦͷ͜ͱ͔Βɺ • • • ͕ͨͬͯ͠ ͱͳΔʢԾఆʹ൓͢Δʣ

Slide 13

Slide 13 text

(6) ର৅ؒͷࣹ͕Έͬͭ • ͜ͷ৔߹͸ ͕ Ͱͳ͍ࣹʹͳΓ͏Δ

Slide 14

Slide 14 text

Haskell ʹ͓͚Δݍ

Slide 15

Slide 15 text

ର৅͸ Haskell ͷܕͱ͢Δ • جຊσʔλܕ : Int, Char, ... • Ϧετ : [Int], [Char], ... • Maybe ܕ : Maybe Int, Maybe Char, ... ͳͲͷ΋ͷ͕ର৅ • Maybe ܕʹ͍ͭͯิ଍ : Maybe Int ͷ஋͸ Just 0, Just 1, ... ·ͨ͸ Nothing

Slide 16

Slide 16 text

ࣹ͸ Haskell ͷؔ਺ͱ͢Δ incr :: Int -> Int incr x = x + 1 • incr ͸ Int ܕͷ஋Λड͚औΓ Int ܕͷ஋Λฦؔ͢਺ • ͜ΕΛ Int ͔Β Int ΁ͷࣹͱΈͳ͢ • ͜ͷର৅ͱࣹʹΑͬͯݍ͕Ͱ͖Δ : Ҏޙ ͱॻ͘ • ͳ͓ɺ߃౳ࣹ͸߃౳ؔ਺ idɺ߹੒͸ؔ਺߹੒ (.)

Slide 17

Slide 17 text

Ҿ਺Λෳ਺࣋ͭؔ਺͸ʁ add :: Int -> Int -> Int add x y = x + y • add ͸ೋͭͷ Int ܕͷ஋Λड͚औΓ Int ܕͷ஋Λฦؔ͢਺ • ɾɾɾͱ͍͏ղऍͷ··ͩͱ ͷࣹͰ͸ͳ͍

Slide 18

Slide 18 text

ΧϦʔԽ add :: Int -> (Int -> Int) • add ͸ Int ܕͷ஋Λड͚औΓ Int -> Int ܕͷ஋Λฦ͢ add 3 :: Int -> Int (add 3) y = 3 + y -- `add 3` ͸ʮ3 Λ଍ؔ͢਺ʯͰ͋Δ • Int -> Int ͸ؔ਺ͷܕͰ͋Γɺ ͷର৅ • add ͸ର৅ Int ͔Β Int -> Int ΁ͷ ͷࣹ

Slide 19

Slide 19 text

༨ஊ • ଟҾ਺ؔ਺Λ1Ҿ਺ؔ਺ͱΈͳ͢ํ๏ͱͯ͠λϓϧ΋ߟ͑ΒΕΔ • (Int, Int) -> Int • ͔͠͠ɺHaskell ͷΧϦʔԽͷ΄͏͕ɺݍ࿦ʹద߹ͤ͞Δͱ ͍͏ҙຯͰ͸ΤϨΨϯτͩͱࢥΘΕΔ

Slide 20

Slide 20 text

ͷ෦෼ݍ • ಛఆͷܕ͚ͩΛूΊͯ෦෼ݍΛߟ͑Δ͜ͱ͕Ͱ͖Δ • ྫɿϦετܕ͚ͩΛର৅ͱͨ͠෦෼ݍ • ྫɿMaybe ܕ͚ͩΛର৅ͱͨ͠෦෼ݍ

Slide 21

Slide 21 text

ؔखʢFunctorʣ

Slide 22

Slide 22 text

ؔखͷఆٛ • ݍ͔Βݍ΁ͷؔख • ͕ ͷର৅ ͸ ͷର৅ • ͕ ͷࣹ ͸ ͷࣹ • ͷ߃౳ࣹ ʹ͍ͭͯ • ͷ߹੒ ʹ͍ͭͯ

Slide 23

Slide 23 text

Haskell ʹ͓͚Δؔख class Functor f where fmap :: (a -> b) -> (f a -> f b) • Functor ͱ͍͏ܕΫϥε͕͋Δ • ͜Ε͕࣮ࡍʹݍ࿦ʹ͓͚Δؔखͷ֓೦ʹ͋ͨΔ΋ͷ • ΑΓ໌ࣔతʹݴ͏ͱɺFunctor ܕΫϥεͷΠϯελϯε͕ؔख

Slide 24

Slide 24 text

ؔखͷྫ Maybe • Maybe ͸ Functor ܕΫϥεͷΠϯελϯε • ͜Ε͸ɺݍ ͔Βݍ ΁ͷؔखͰ͋Δ • Maybe ͸೚ҙͷܕ T ͔Β৽͍͠ܕ Maybe T Λ࡞Δ • Int ͔Β Maybe Int, Char ͔Β Maybe Char, ... • ͭ·Γɺ ͷର৅Λ ͷର৅ʹ͏ͭ͢

Slide 25

Slide 25 text

ؔखͷྫ Maybe fmap :: (a -> b) -> (Maybe a -> Maybe b) fmap f :: Maybe a -> Maybe b fmap f (Just x) = Just (f x) fmap f Nothing = Nothing • f :: a -> b Λ fmap f :: Maybe a -> Maybe b ʹ • ͭ·Γɺ ͷࣹΛ ͷࣹʹ͏ͭ͢ • ͕ͨͬͯ͠ɺMaybe ͸ ͔Β ΁ͷؔख

Slide 26

Slide 26 text

Functor ͰԿ͕خ͍͠ͷ͔ • Maybe Int ܕͷ஋Λͦͷ··ѻ͓͏ͱ͢Δͱ৔߹෼͚͕ඞཁ • ஋Λ࣋ͭ Just 1 ͳͲͷ৔߹ • ஋Λ࣋ͨͳ͍ Nothing ͷ৔߹ • Functor ͷߟ͑Λ࢖͑͹ɺNothing ͷ͜ͱ͸๨Ε͍͍ͯ • Int ʹ͍͚ͭͯͩؔ਺ఆٛ͢Ε͹͍͍

Slide 27

Slide 27 text

Haskell ͷ Functor ͷ஫ҙ • Functor ܕΫϥεͷΠϯελϯεΛ࡞ͬͯ΋ɺͦΕ͕ؔखͷఆ ٛΛຬ͍ͨͯ͠Δ͜ͱ͸อূ͞Εͳ͍ • ର৅ͱର৅ͷରԠɺࣹͱࣹͱରԠ͸ɺࣗવʹͰ͖Δ • ߃౳ࣹͱ߹੒ʹ͍ͭͯ͸ɺఆٛΛຬͨ͢Α͏ʹࣗ෼ͰؾΛ͚ͭ Δ

Slide 28

Slide 28 text

ྫ : ؔखʹͳΒͳ͍΋ͷ CMaybe a = CNothing | CJust Int a fmap f CNothing = CNothing fmap f (CJust counter x) = CJust (counter + 1) (f x) ҎԼͷΑ͏ʹ߃౳ࣹΛอͨͳ͍ɺ·ͨ߹੒΋อͨͳ͍ fmap id (CJust 0 "abc") -- CJust 1 "abc" id (CJust 0 "abc") -- CJust 0 "abc"

Slide 29

Slide 29 text

͞ΒͳΔ࿩୊

Slide 30

Slide 30 text

͞ΒͳΔ࿩୊ • ݍ࿦ʹ͓͚ΔϞφυ : ࣗݾؔखͰࣗવม׵Λ࣋ͭ΋ͷ • Haskell Ͱॏࢹ͞ΕΔͷ͸ϞφυʢMonadʣ • Monad ಉ࢜ΛνΣΠϯͤ͞Δ͜ͱ͕Ͱ͖Δ • ෭࡞༻Λ Monad ʹด͡ࠐΊΔ͜ͱ͕Ͱ͖Δ • ͦΕ͸·ͨͦͷ͏ͪɾɾɾ