Slide 1

Slide 1 text

Swift Functional Programming Hirofumi Wakasugi (@5T111111)

Slide 2

Slide 2 text

4XJGUؔ਺ܕϓϩάϥϛϯά let list: List = .cons("pork", .cons("beef", .cons("chicken", .null))) // => (pork . (beef . (chicken . ()))) car(list) // => pork cdr(list) // => (beef . (chicken . ())) car(cdr(list)) // => beef cdr(cdr(list)) // => (chicken . ())

Slide 3

Slide 3 text

!)JSPGVNJ8BLBTVHJ !U  4XJGUษڧத ؔ਺ܕϓϩάϥϛϯάษڧத ࣗݾ঺հ

Slide 4

Slide 4 text

8IZ4XJGU  ͳͥ4XJGUͷ࿩Λ͢Δͷ͔ͷઆ໌  4XJGUͰؔ਺ܕϓϩάϥϛϯάͷ࣮ફ * ίʔυͷ࣮ྫɺέʔεελσΟ ** ؔ਺ܕϓϩάϥϛϯάͷͨΊͷϥΠϒϥϦͷ঺հ *** 4%, $PDPB ʹΑΔ੍ݶͱͦͷXPSLBSPVOE ؔ਺ܕϓϩάϥϛϯάελΠϧͰͷ8FCϓϩάϥϛϯά * 7BQPSͱ͍͏8"'Λ࢖ͬͯؔ਺ܕϓϩάϥϛϯάΛద༻ͯ͠ΈΔ ΞδΣϯμ

Slide 5

Slide 5 text

8IZ4XJGU  ͳͥ4XJGUͷ࿩Λ͢Δͷ͔ͷઆ໌  4XJGUͰؔ਺ܕϓϩάϥϛϯάͷ࣮ફ * ίʔυͷ࣮ྫɺέʔεελσΟ ** ؔ਺ܕϓϩάϥϛϯάͷͨΊͷϥΠϒϥϦͷ঺հ *** 4%, $PDPB ʹΑΔ੍ݶͱͦͷXPSLBSPVOE ؔ਺ϓϩάϥϛϯάελΠϧͰͷ8FCϓϩάϥϛϯά * 7BQPSͱ͍͏8"'Λ࢖ͬͯؔ਺ܕϓϩάϥϛϯάΛద༻ͯ͠ΈΔ ΞδΣϯμ ࠓ೔࿩͢ͷ͸͜Ε͚ͩʂ

Slide 6

Slide 6 text

8):48*'5

Slide 7

Slide 7 text

w੩తͳܕνΣοΫͱܕ҆શੑΛඋ͑ͨܕγεςϜ͕͋Δ wωΠςΟϒίʔυʹίϯύΠϧ͞ΕΔ wαʔόʔαΠυͷ8FCϓϩάϥϛϯάͰ࢖͑ΔՄೳੑ͕͋Δ ݸਓతͳझຯ ❤

Slide 8

Slide 8 text

w੩తͳܕνΣοΫͱܕ҆શੑΛඋ͑ͨܕγεςϜ͕͋Δ wωΠςΟϒίʔυʹίϯύΠϧ͞ΕΔ wαʔόʔαΠυͷ8FCϓϩάϥϛϯάͰ࢖͑ΔՄೳੑ͕͋Δ ݸਓతͳझຯ (PͰ͠ΐ

Slide 9

Slide 9 text

w੩తͳܕνΣοΫͱܕ҆શੑΛඋ͑ͨܕγεςϜ͕͋Δ wωΠςΟϒίʔυʹίϯύΠϧ͞ΕΔ wαʔόʔαΠυͷ8FCϓϩάϥϛϯάͰ࢖͑ΔՄೳੑ͕͋Δ ݸਓతͳझຯ Swift

Slide 10

Slide 10 text

8):48*'5

Slide 11

Slide 11 text

ؔ਺ܕϓϩάϥϛϯάͱ4XJGU

Slide 12

Slide 12 text

ͦ΋ͦ΋

Slide 13

Slide 13 text

4XJGUͰ ؔ਺ܕϓϩάϥϛϯά ͱ͍͏ωλ͕

Slide 14

Slide 14 text

શ͘໨৽͍͠΋ͷͰ͸ͳ͍

Slide 15

Slide 15 text

͘Β͍͸࿩͞Ε͖ͯͨ ͨͿΜ

Slide 16

Slide 16 text

ͳΜͰ·ͨ͋͑ͯ ͦΜͳ࿩Λ͍ͨ͠ͷ͔

Slide 17

Slide 17 text

"QQMF88%$ 4XJGUൃද

Slide 18

Slide 18 text

ؔ਺͕ϑΝʔετΫϥεʁ

Slide 19

Slide 19 text

pMUFSSFEVDFNBQqBU.BQ

Slide 20

Slide 20 text

0QUJPOBM

Slide 21

Slide 21 text

ͥΜͿ 0CKFDUJWF$ʹ͸ ͳ͔ͬͨͧʁ

Slide 22

Slide 22 text

ؔ਺ܕͷಛ௃Λඋ͑ͨݴޠ͕ "QQMFެࣜͰ ʮJ04NBD04։ൃʯ ͱ͍͏ڊେϚʔέοτʹݱΕͨ

Slide 23

Slide 23 text

ྑ͘΋ѱ͘΋ ؔ਺ܕʹରͯ͠ ஫໨͕ू·Δ ͭͷ͖͔͚ͬʹͳͬͨ

Slide 24

Slide 24 text

͡Ό͋

Slide 25

Slide 25 text

4XJGU͸ؔ਺ܕϓϩ άϥϛϯάݴޠͳ ͷ͔ʁ

Slide 26

Slide 26 text

/0

Slide 27

Slide 27 text

4XJGUͰؔ਺ܕϓϩ άϥϛϯά͸Մೳ ͔ʁ

Slide 28

Slide 28 text

*%0/`55)*/,40 ؔ਺ܕϓϩάϥϛϯά͸ίʔσΟϯάελΠϧʹա͗ͳ ͍ͱ͍͏ݟํ΋͋Δ͕ɺ ؔ਺ܕͬΆ͍ػೳ΍ख๏ΛҰ෦औΓೖΕͯ΋ ͦΕ͚ͩͰ͸ؔ਺ܕϓϩάϥϛϯάʹ͸ͳΒͳ͍ͱࢥ͏ FH+BWB4DSJQU+BWB3VCZ$ -JOR FUD

Slide 29

Slide 29 text

ͦ͏ࢥͬͯͨ࣌ظ͕Ӡʑ

Slide 30

Slide 30 text

͋Εʁ Α͘ݟͯΈΔͱʜ 4XJGU͸ࢥͬͨҎ্ʹ ؔ਺ܕϓϩάϥϛϯά͕ ΍Γ΍ͦ͢͏ʹݟ͑·ͧ͢ʁʁ

Slide 31

Slide 31 text

4XJGUͰ͸ʜ w ؔ਺Λ஋ͱͯ͠ѻ͑Δ w ؔ਺͸ϑΝʔετΫϥε w typealiasͰؔ਺ͷܕఆٛ΋Մೳ MJLFtypeJO)BTLFMM

Slide 32

Slide 32 text

4XJGUͰ͸ʜ w .PEVMBCMFͳσβΠϯ΍એݴతͳهड़Λ΍Γ΍͘͢͢Δ࢓૊Έ͕͋Δ w 0QUJPOBM "SSBZͳͲ͕'VODUPS.POBEͱ࣮ͯ͠૷͞Ε͍ͯΔ
 ϝιουνΣʔϯͰ͖Δ w 1SPUPDPM1SPUPDPM&YUFOTJPOͰܕΛ֦ு MJLFUZQFDMBTTUZQF DMBTTJOTUBODJBUJPO  w ԋࢉࢠͷఆ͕ٛՄೳ <*> <^>)

Slide 33

Slide 33 text

w ෭࡞༻Λൃੜͤ͞ʹ͍͘ ࢀরಁաʹ͠΍͍͢  w σʔλܕ͕جຊJNNVUBCMFͳ஋ܕ w letʹΑΔଋറΛଅਐ͢Δݴޠ࢓༷ w *NNVUBCMFͳ஋͸ίϯύΠϥʹΑͬͯ࠷దԽ͞ΕΔ 4XJGUͰ͸ʜ

Slide 34

Slide 34 text

w౰ͨΓલͷΑ͏ʹΫϩʔδϟ͕͋Δ w౰ͨΓલͷΑ͏ʹύλʔϯϚον͕͋Δ w౰ͨΓલͷΑ͏ʹHVBSEจ͕͋Δ w౰ͨΓલͷΑ͏ʹ຤ඌ࠶ؼ͕࠷దԽ͞ΕΔ w౰ͨΓલͷΑ͏ʹΧϦʔԽʹઐ༻ͷߏจ͕͋Δ 4XJGUͰফ͑·ͨ͠ʂ 4XJGUͰ͸ʜ

Slide 35

Slide 35 text

ެࣜͳݟղ w"QQMFࣗ਎͸4XJGU͕ؔ਺ܕͩͱ͸શ͘ݴͬͯͳ͍

Slide 36

Slide 36 text

ެࣜͳݟղ w"QQMFࣗ਎͸4XJGU͕ؔ਺ܕͩͱ͸શ͘ݴͬͯͳ͍ ͕ɺ101701ͳϓϩάϥϛϯάΛڧ͘ਪ঑ (WWDC 2015 - Building Better Apps with Value Types in Swift) (WWDC 2016 - Protocol and Value Oriented Programming in UIKit Apps) 001͔ΒͷύϥμΠϜγϑτ͸Ψν

Slide 37

Slide 37 text

ެࣜͳݟղ “Objective-C without the C” implies something subtractive, but Swift dramatically expands the design space through the introduction of generics and functional programming concepts. - Chris Lattner

Slide 38

Slide 38 text

'VDOUJPOBM4XJGU$PNNVOJUZ w'VODUJPOBM4XJGU$POGFSFODF
 IUUQGVOTXJGUDPOGDPN  wUZQFMJGU4XJGU[ wUIPVHIUCPU3VOFT

Slide 39

Slide 39 text

ઐ໳Ͱॻ੶΋ग़͍ͯΔ

Slide 40

Slide 40 text

͜Ε͸΋͏ ؔ਺ܕϓϩάϥϛϯά͕Ͱ͖Δͱ ݴ͍͍ͬͯΜ͡Όͳ͍Ͱ͔͢Ͷʜ

Slide 41

Slide 41 text

͋Εʁ

Slide 42

Slide 42 text

ͳΜͰ·ͨ͋͑ͯࠓߋ ʮ4XJGUͰؔ਺ܕΆΑΆΑʙʯ Έ͍ͨͳ࿩Λ͍ͨ͠ͷ͔ શવ͜ͷཧ༝ʹͳͬͯͳ͘ͳ͍ʁ

Slide 43

Slide 43 text

8):48*'5

Slide 44

Slide 44 text

4XJGU1SPHSBNNJOH-BOHVBHF&WPMVUJPO IUUQTHJUIVCDPNBQQMFTXJGUFWPMVUJPO 4XJGUJTFWPMWJOH UPP GBTU

Slide 45

Slide 45 text

&OVNͰ࠶ؼతͳσʔλߏ଄Λ࡞Εͳ͍

Slide 46

Slide 46 text

4XJGUͰ࣮૷ࡁ enum List { case null indirect case cons(T, List) } ˢ๯಄ͷϦετͷ࣮૷Ͱ΋࠶ؼ&OVNΛ࢖͍ͬͯΔ

Slide 47

Slide 47 text

UZQFBMJBTʹHFOFSJDT͕࢖͑ͳ͍

Slide 48

Slide 48 text

UZQFBMJBTʹHFOFSJDT͕࢖͑ͳ͍ 4XJGUͰ࢖͑ΔΑ͏ʹͳͬͨ

Slide 49

Slide 49 text

ଞʹ΋ʜ wFYQFSJNFOUBMͰ͸͋Δ͕ؔ਺߹੒ԋࢉࢠ͕ຊମʹ࣮૷
 IUUQTHJUIVCDPNBQQMFTXJGUCMPCECDDCEGEEFTUEMJC JOUFSOBM4XJGU&YQFSJNFOUBM4XJGU&YQFSJNFOUBMTXJGU- w(FOFSJDT.BOJGFTUPͷதͰߴ֊ܕͷ࣮૷ܭը͋Γ
 IUUQTHJUIVCDPNBQQMFTXJGUCMPCECDDCEGEEFEPDT (FOFSJDT.BOJGFTUPNEIJHIFSLJOEFEUZQFT 
 protocol Functor { associatedtype A func fmap(f: A -> FB.A) -> FB }

Slide 50

Slide 50 text

ׂͱΨϯΨϯมΘͬͯΔ wωοτͷ࣍৘ใ͸ݹ͘ͳ͍ͬͯΔ΋ͷ΋ଟ͍ wؔ਺ܕϓϩάϥϛϯάͷจ຺Ͱͷมߋ΋ؚ·ΕΔ 4XJGUJTFWPMWJOH UPP GBTU ʮ4XJGUͰؔ਺ܕϓϩάϥϛϯάແཧʯ ͬͯࢥͬͨਓ΋࠷৽৘ใʹ৮ΕΔͱ໘ന͍͔΋ʁ