Slide 1

Slide 1 text

͸͡Ίͯͷؔ਺ܕ ϓϩάϥϛϯάڭࣨ Hands-on Functional Programming in Scala

Slide 2

Slide 2 text

ຊ೔࿩͢͜ͱ • ײ֮తʹཧղ͢Δؔ਺ܕϓϩάϥϛϯά • ίϨΫγϣϯͷ͜ͱ • ύλʔϯϚονͷ͜ͱ • ࠶ؼͷ͜ͱ

Slide 3

Slide 3 text

ຊ೔࿩͞ͳ͍͜ͱ • Scalaͷ࣮༻తͳจ๏ • Ϋϩʔδϟ • ෦෼ద༻ • ΧϦʔԽ • ϞφυͳͲ

Slide 4

Slide 4 text

ScalaΛಈ͔͢·Ͱ

Slide 5

Slide 5 text

Mac OSΛ͓࢖͍ͷํ XCodeΛΠϯετʔϧ Command Line Developer ToolsΛΠϯετʔϧ $ xcode-select —install XCodeͷϥΠηϯεʹಉҙ $ sudo xcodebuild -license HomebrewΠϯετʔϧ $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com /Homebrew/install/master/install)” ScalaΠϯετʔϧ $ brew install scala

Slide 6

Slide 6 text

Mac OSΛ͓࢖͍ͷํ XCodeΛΠϯετʔϧ Command Line Developer ToolsΛΠϯετʔϧ $ xcode-select —install XCodeͷϥΠηϯεʹಉҙ $ sudo xcodebuild -license HomebrewΠϯετʔϧ $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com /Homebrew/install/master/install)” ScalaΠϯετʔϧ $ brew install scala ͜Ε͚ͩ

Slide 7

Slide 7 text

WindowsΛ͓࢖͍ͷํ • JDKΠϯετʔϧʢJava SEʣ
 http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html • ScalaΠϯετʔϧ
 http://www.scala-lang.org/download/ • ؀ڥม਺Λઃఆ
 ίϯτϩʔϧύωϧʼγεςϜʼγεςϜͷৄࡉઃఆ
 Ϣʔβʔఆٛ؀ڥม਺ʹ৽ن௥Ճʢ໊લ͸PATHʹઃఆʣ
 JDKΛΠϯετʔϧͨ͠ϑΥϧμԼbin·Ͱͷύε;ʢʀͰ۠੾Δʣ
 ScalaΛΠϯετʔϧͨ͠ϑΥϧμԼͷbin·Ͱͷύε

Slide 8

Slide 8 text

؀ڥߏங͕໘౗͍͘͞ํ • ΦϯϥΠϯͷScala࣮ߦ؀ڥ͕͋Γ·͢ • tutorialspoint.com • paiza.io • codebunk.com • scastie.org

Slide 9

Slide 9 text

ศརͳπʔϧ

Slide 10

Slide 10 text

“Hello Scala!”

Slide 11

Slide 11 text

REPL $ scala Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> println("Hello Scala!") Hello Scala! scala> :quit

Slide 12

Slide 12 text

REPL $ scala Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> println("Hello Scala!") Hello Scala! scala> :quit λʔϛφϧ͔Β”scala”ίϚϯυΛ࣮ߦ

Slide 13

Slide 13 text

REPL $ scala Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> println("Hello Scala!") Hello Scala! scala> :quit λʔϛφϧ͔Β”scala”ίϚϯυΛ࣮ߦ ऴྃ͢Δͱ͖͸”:quit”΋͘͠͸”:q”

Slide 14

Slide 14 text

IDE object Main { def main(args: Array[String]) { println("Hello, Scala!") } }

Slide 15

Slide 15 text

IDE object Main { def main(args: Array[String]) { println("Hello, Scala!") } } ͓·͡ͳ͍

Slide 16

Slide 16 text

IDE object Main { def main(args: Array[String]) { println("Hello, Scala!") def hello(lang:String = "World"): String = "Hello, %s!".format(lang) println(hello("Scala")) } } ͓·͡ͳ͍ ͜Μͳ͔Μ͡ͰॲཧΛॻ͍͍͖ͯ·͢

Slide 17

Slide 17 text

15෼ͰֶͿ Scala

Slide 18

Slide 18 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον

Slide 19

Slide 19 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον ࠓ೔͸͜Ε͚ͩ

Slide 20

Slide 20 text

Scalaͷ͍͍ͱ͜Ζ • ܕਪ࿦ (Type Inference) • ϓϨʔεϗϧμʔ • ౶ҥߏจ (Syntactic sugar) • ڧྗͳύλʔϯϚον • ҉໧ͷܕม׵ (Implicit Conversions)

Slide 21

Slide 21 text

ScalaٯҾ͖Ϩγϐ ஛ఴ௚थʗౡຊଟՄࢠ ஶ

Slide 22

Slide 22 text

ScalaٯҾ͖Ϩγϐ ஛ఴ௚थʗౡຊଟՄࢠ ஶ ৄ͘͠͸ͪ͜Β

Slide 23

Slide 23 text

Scala ΫϨυ • var ېࢭ • mutable ېࢭ • while/for ϧʔϓ ېࢭ • null ېࢭ • Option.get ېࢭ • return ېࢭ • if ېࢭ (൒෼৑ஊ)

Slide 24

Slide 24 text

Scala ΫϨυ • var ېࢭ • mutable ېࢭ • while/for ϧʔϓ ېࢭ • null ېࢭ • Option.get ېࢭ • return ېࢭ • if ېࢭ (൒෼৑ஊ) ࣾ಺Ͱ͸పఈͯ͠·͢

Slide 25

Slide 25 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον

Slide 26

Slide 26 text

ඪ४ग़ྗ scala> println("Hello, Scala!") Hello, Scala! scala> print("Hello, Scala!”) Hello, Scala!

Slide 27

Slide 27 text

ඪ४ग़ྗ scala> println("Hello, Scala!") Hello, Scala! scala> print("Hello, Scala!”) Hello, Scala! վߦ΋Ұॹʹग़ྗ͞ΕΔ

Slide 28

Slide 28 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον

Slide 29

Slide 29 text

ม਺એݴ • val • ࠶୅ೖෆՄೳʢImmutableʣ • var • ࠶୅ೖՄೳʢMutableʣ

Slide 30

Slide 30 text

ม਺એݴ scala> val lang = "scala" lang: String = scala

Slide 31

Slide 31 text

ม਺એݴ scala> val lang = "scala" lang: String = scala scala> lang = "java" :8: error: reassignment to val lang = "java" ^

Slide 32

Slide 32 text

ม਺એݴ scala> val lang = "scala" lang: String = scala scala> lang = "java" :8: error: reassignment to val lang = "java" ^ ࠶୅ೖෆՄ

Slide 33

Slide 33 text

ม਺એݴ scala> val lang = "scala" lang: String = scala scala> lang = "java" :8: error: reassignment to val lang = "java" ^ scala> var lang = "php" lang: String = php ࠶୅ೖෆՄ

Slide 34

Slide 34 text

ม਺એݴ scala> val lang = "scala" lang: String = scala scala> lang = "java" :8: error: reassignment to val lang = "java" ^ scala> var lang = "php" lang: String = php scala> lang = "ruby" lang: String = ruby ࠶୅ೖෆՄ

Slide 35

Slide 35 text

ม਺એݴ scala> val lang = "scala" lang: String = scala scala> lang = "java" :8: error: reassignment to val lang = "java" ^ scala> var lang = "php" lang: String = php scala> lang = "ruby" lang: String = ruby ࠶୅ೖෆՄ ࠶୅ೖՄ

Slide 36

Slide 36 text

ܕͷ͋Δม਺એݴ • val ม਺໊: ܕ = ஋ • ࠶୅ೖෆՄೳʢImmutableʣ • var ม਺໊: ܕ = ஋ • ࠶୅ೖՄೳʢMutableʣ

Slide 37

Slide 37 text

ܕͷ͋Δม਺એݴ scala> val num0: Int = 1 num0: Int = 1

Slide 38

Slide 38 text

ܕͷ͋Δม਺એݴ scala> val num0: Int = 1 num0: Int = 1

Slide 39

Slide 39 text

ܕͷ͋Δม਺એݴ scala> val num0: Int = 1 num0: Int = 1 scala> val num0: Int = "1" :7: error: type mismatch; found : String("1") required: Int val num0: Int = "1" ^

Slide 40

Slide 40 text

ܕͷ͋Δม਺એݴ scala> val num0: Int = 1 num0: Int = 1 scala> val num0: Int = "1" :7: error: type mismatch; found : String("1") required: Int val num0: Int = "1" ^ ܕ͕ҟͳΔ

Slide 41

Slide 41 text

ܕͷ͋Δม਺એݴ scala> val num0: Int = 1 num0: Int = 1 scala> val num0: Int = "1" :7: error: type mismatch; found : String("1") required: Int val num0: Int = "1" ^ scala> val num0: String = "1" num0: String = 1 ܕ͕ҟͳΔ

Slide 42

Slide 42 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον

Slide 43

Slide 43 text

Ϧςϥϧͬͯͳʹʁ • ม਺ • ม਺͸ϓϩάϥϜͷϩδοΫͷதʹ஋Λ௚઀ॻ ͔ͣʹҰ౓୅ೖͨ͠΋ͷΛ࢖͏͜ͱ • Ϧςϥϧ • ϓϩάϥϜͷதʹ਺ࣈ΍จࣈͳͲͷ஋Λ
 ௚઀ॻ͍ͨఆ਺ͷ͜ͱ

Slide 44

Slide 44 text

Ϧςϥϧͬͯͳʹʁ • ม਺ • ม਺͸ϓϩάϥϜͷϩδοΫͷதʹ஋Λ௚઀ॻ ͔ͣʹҰ౓୅ೖͨ͠΋ͷΛ࢖͏͜ͱ • Ϧςϥϧ • ϓϩάϥϜͷதʹ਺ࣈ΍จࣈͳͲͷ஋Λ
 ௚઀ॻ͍ͨఆ਺ͷ͜ͱ ରٛޠ

Slide 45

Slide 45 text

Ϧςϥϧͬͯͳʹʁ scala> 12345 res0: Int = 12345 scala> "BizReach" res1: String = BizReach ੔਺Ϧςϥϧ จࣈྻϦςϥϧ

Slide 46

Slide 46 text

ؔ਺Ϧςϥϧ • ؔ਺ΛҰ౓ม਺ʹ୅ೖͤͣʢ໊લΛ෇͚ͣʣ ʹϓϩάϥϜͷதʹ௚઀ॻ͘͜ͱ Y*OU Y

Slide 47

Slide 47 text

ؔ਺Ϧςϥϧ • ؔ਺ΛҰ౓ม਺ʹ୅ೖͤͣʢ໊લΛ෇͚ͣʣ ʹϓϩάϥϜͷதʹ௚઀ॻ͘͜ͱ Y*OU Y ؔ਺ʹ౉͢஋

Slide 48

Slide 48 text

ؔ਺Ϧςϥϧ • ؔ਺ΛҰ౓ม਺ʹ୅ೖͤͣʢ໊લΛ෇͚ͣʣ ʹϓϩάϥϜͷதʹ௚઀ॻ͘͜ͱ Y*OU Y ؔ਺ʹ౉͢஋ ౉͢஋ͷܕ

Slide 49

Slide 49 text

ؔ਺Ϧςϥϧ • ؔ਺ΛҰ౓ม਺ʹ୅ೖͤͣʢ໊લΛ෇͚ͣʣ ʹϓϩάϥϜͷதʹ௚઀ॻ͘͜ͱ Y*OU Y ؔ਺ʹ౉͢஋ ౉͢஋ͷܕ

Slide 50

Slide 50 text

ؔ਺Ϧςϥϧ • ؔ਺ΛҰ౓ม਺ʹ୅ೖͤͣʢ໊લΛ෇͚ͣʣ ʹϓϩάϥϜͷதʹ௚઀ॻ͘͜ͱ Y*OU Y ؔ਺ʹ౉͢஋ ౉͢஋ͷܕ ؔ਺ͷॲཧͱ݁Ռ

Slide 51

Slide 51 text

ؔ਺Ϧςϥϧ scala> val plus = (x:Int, y:Int) => x + y plus: (Int, Int) => Int =

Slide 52

Slide 52 text

ؔ਺Ϧςϥϧ scala> val plus = (x:Int, y:Int) => x + y plus: (Int, Int) => Int = ؔ਺ϦςϥϧΛ

Slide 53

Slide 53 text

ؔ਺Ϧςϥϧ scala> val plus = (x:Int, y:Int) => x + y plus: (Int, Int) => Int = ؔ਺ϦςϥϧΛ ม਺ʹ୅ೖ

Slide 54

Slide 54 text

ؔ਺Ϧςϥϧ scala> val plus = (x:Int, y:Int) => x + y plus: (Int, Int) => Int = scala> val sum = (x: Int, y: Int) => { | println("x is " + x) | println("y is " + y) | x + y | } sum: (Int, Int) => Int = ؔ਺ϦςϥϧΛ ม਺ʹ୅ೖ

Slide 55

Slide 55 text

ؔ਺Ϧςϥϧ scala> val plus = (x:Int, y:Int) => x + y plus: (Int, Int) => Int = scala> val sum = (x: Int, y: Int) => { | println("x is " + x) | println("y is " + y) | x + y | } sum: (Int, Int) => Int = ؔ਺ϦςϥϧΛ ม਺ʹ୅ೖ ෳ਺ߦͷ৔߹

Slide 56

Slide 56 text

ؔ਺Ϧςϥϧ scala> val plus = (x:Int, y:Int) => x + y plus: (Int, Int) => Int = scala> val sum = (x: Int, y: Int) => { | println("x is " + x) | println("y is " + y) | x + y | } sum: (Int, Int) => Int = scala> sum(2, 3) x is 2 y is 3 res4: Int = 5 ؔ਺ϦςϥϧΛ ม਺ʹ୅ೖ ෳ਺ߦͷ৔߹ ࠷ޙͷߦ͕ධՁ͞ΕΔ

Slide 57

Slide 57 text

defΩʔϫʔυΛ࢖ͬͨؔ਺ఆٛ object Untitled { def main(args:Array[String]) = { def plus(x: Int, y: Int):Int = { x + y } } }

Slide 58

Slide 58 text

defΩʔϫʔυΛ࢖ͬͨؔ਺ఆٛ object Untitled { def main(args:Array[String]) = { def plus(x: Int, y: Int):Int = { x + y } } } ໭Γ஋ͷܕ

Slide 59

Slide 59 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον

Slide 60

Slide 60 text

ίϨΫγϣϯ • List • Range • Tuple

Slide 61

Slide 61 text

ίϨΫγϣϯ • List • Range • Tuple ࠓ೔͸͜Ε͚ͩ

Slide 62

Slide 62 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3)

Slide 63

Slide 63 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) جຊతͳListͷ࡞Γํ

Slide 64

Slide 64 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() جຊతͳListͷ࡞Γํ

Slide 65

Slide 65 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ

Slide 66

Slide 66 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() scala> val ls: List[Int] = List(1, 2, 3) ls: List[Int] = List(1, 2, 3) جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ

Slide 67

Slide 67 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() scala> val ls: List[Int] = List(1, 2, 3) ls: List[Int] = List(1, 2, 3) جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ ܕΛએݴͯ͠ม਺ʹ୅ೖ

Slide 68

Slide 68 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() scala> val ls: List[Int] = List(1, 2, 3) ls: List[Int] = List(1, 2, 3) scala> val ls0 = 0 :: ls ls0: List[Int] = List(0, 1, 2, 3) جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ ܕΛએݴͯ͠ม਺ʹ୅ೖ

Slide 69

Slide 69 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() scala> val ls: List[Int] = List(1, 2, 3) ls: List[Int] = List(1, 2, 3) scala> val ls0 = 0 :: ls ls0: List[Int] = List(0, 1, 2, 3) جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ ܕΛએݴͯ͠ม਺ʹ୅ೖ Ϧετͷઌ಄ʹ௥Ճ͢Δ஋::ListͰ ৽͍͠ϦετΛͭ͘Γͬ·͢

Slide 70

Slide 70 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() scala> val ls: List[Int] = List(1, 2, 3) ls: List[Int] = List(1, 2, 3) scala> val ls0 = 0 :: ls ls0: List[Int] = List(0, 1, 2, 3) scala> 0 :: 1 :: 2 :: 3 :: Nil res2: List[Int] = List(0, 1, 2, 3) جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ ܕΛએݴͯ͠ม਺ʹ୅ೖ Ϧετͷઌ಄ʹ௥Ճ͢Δ஋::ListͰ ৽͍͠ϦετΛͭ͘Γͬ·͢

Slide 71

Slide 71 text

List scala> List(0, 1, 2, 3) res0: List[Int] = List(0, 1, 2, 3) scala> Nil res1: scala.collection.immutable.Nil.type = List() scala> val ls: List[Int] = List(1, 2, 3) ls: List[Int] = List(1, 2, 3) scala> val ls0 = 0 :: ls ls0: List[Int] = List(0, 1, 2, 3) scala> 0 :: 1 :: 2 :: 3 :: Nil res2: List[Int] = List(0, 1, 2, 3) جຊతͳListͷ࡞Γํ ۭͷϦετͷ࡞Γํ ܕΛએݴͯ͠ม਺ʹ୅ೖ Ϧετͷઌ಄ʹ௥Ճ͢Δ஋::ListͰ ৽͍͠ϦετΛͭ͘Γͬ·͢ ۭͷϦετʹରͯ͠஋Λ௥Ճͨ͠Γ ෳ਺ͷ஋Λ::Ͱ௥Ճग़དྷ·͢

Slide 72

Slide 72 text

Range scala> 1 to 10

Slide 73

Slide 73 text

Range scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 1͔Β10·Ͱͷ੔਺ྻ

Slide 74

Slide 74 text

Range scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> 1 until 10 res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) 1͔Β10·Ͱͷ੔਺ྻ

Slide 75

Slide 75 text

Range scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> 1 until 10 res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) 1͔Β10·Ͱͷ੔਺ྻ 1͔Β10ະຬͷ੔਺ྻ

Slide 76

Slide 76 text

Range scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> 1 until 10 res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> 1 to 10 by 2 res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9) 1͔Β10·Ͱͷ੔਺ྻ 1͔Β10ະຬͷ੔਺ྻ

Slide 77

Slide 77 text

Range scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> 1 until 10 res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> 1 to 10 by 2 res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9) 1͔Β10·Ͱͷ੔਺ྻ 1͔Β10ະຬͷ੔਺ྻ 1͔Β10·Ͱެࠩ2ͷ౳ࠩ਺ྻ

Slide 78

Slide 78 text

Tuple scala> ("JAVA", "Eclipse") res0: (String, String) = (JAVA,Eclipse) scala> ("Scala", "IntelliJ") res1: (String, String) = (Scala,IntelliJ)

Slide 79

Slide 79 text

Tuple scala> ("JAVA", "Eclipse") res0: (String, String) = (JAVA,Eclipse) scala> ("Scala", "IntelliJ") res1: (String, String) = (Scala,IntelliJ) ஋ͷηοτͰ͢

Slide 80

Slide 80 text

Tuple scala> ("JAVA", "Eclipse") res0: (String, String) = (JAVA,Eclipse) scala> ("Scala", "IntelliJ") res1: (String, String) = (Scala,IntelliJ) scala> ("Apple", "Orange", "Banana") res2: (String, String, String) = (Apple,Orange,Banana) ஋ͷηοτͰ͢ ෳ਺ͷ஋Λ·ͱΊΔ

Slide 81

Slide 81 text

Tuple scala> ("JAVA", "Eclipse") res0: (String, String) = (JAVA,Eclipse) scala> ("Scala", "IntelliJ") res1: (String, String) = (Scala,IntelliJ) scala> ("Apple", "Orange", "Banana") res2: (String, String, String) = (Apple,Orange,Banana) scala> List(("Apple", "Orange"), ("Strawberry", “Cherry")) res3: List[(String, String)] = List((Apple,Orange), (Strawberry,Cherry)) ஋ͷηοτͰ͢ ෳ਺ͷ஋Λ·ͱΊΔ λϓϧͷϦετΛ࡞Δ

Slide 82

Slide 82 text

Tuple scala> ("JAVA", "Eclipse") res0: (String, String) = (JAVA,Eclipse) scala> ("Scala", "IntelliJ") res1: (String, String) = (Scala,IntelliJ) scala> ("Apple", "Orange", "Banana") res2: (String, String, String) = (Apple,Orange,Banana) scala> List(("Apple", "Orange"), ("Strawberry", “Cherry")) res3: List[(String, String)] = List((Apple,Orange), (Strawberry,Cherry)) ஋ͷηοτͰ͢ ෳ਺ͷ஋Λ·ͱΊΔ λϓϧͷϦετΛ࡞Δ ܕ͸͜ͷΑ͏ʹͳΓ·͢

Slide 83

Slide 83 text

ຊ೔ͷScalaจ๏͓͠ͳ͕͖ • ग़ྗ • ม਺ • ؔ਺Ϧςϥϧ • ίϨΫγϣϯ • ύλʔϯϚον

Slide 84

Slide 84 text

ύλʔϯϚον object Untitled { def main(args:Array[String]) = { val lang = "Scala" lang match { case "Java" => println("Eclipse") case "Scala" => println("IntelliJ") case "PHP" | "Ruby"=> println("CodeRunner") case _ => println("Vim") } } }

Slide 85

Slide 85 text

ύλʔϯϚον object Untitled { def main(args:Array[String]) = { val lang = "Scala" lang match { case "Java" => println("Eclipse") case "Scala" => println("IntelliJ") case "PHP" | "Ruby"=> println("CodeRunner") case _ => println("Vim") } } } “IntelliJ”͕ग़ྗ͞ΕΔ

Slide 86

Slide 86 text

ύλʔϯϚον object Untitled { def main(args:Array[String]) = { val lang:String = "Scala" val ide:String = lang match { case "Java" => "Eclipse" case "Scala" => "IntelliJ" case "PHP" | "Ruby"=> "CodeRunner" case _ => "Vim" } println("Use "+ ide +".") } }

Slide 87

Slide 87 text

ύλʔϯϚον object Untitled { def main(args:Array[String]) = { val lang:String = "Scala" val ide:String = lang match { case "Java" => "Eclipse" case "Scala" => "IntelliJ" case "PHP" | "Ruby"=> "CodeRunner" case _ => "Vim" } println("Use "+ ide +".") } } ஋Λฦ͢͜ͱ΋Ͱ͖·͢

Slide 88

Slide 88 text

ύλʔϯϚον object Untitled { def main(args:Array[String]) = { val lang:String = "Scala" val ide:String = lang match { case "Java" => "Eclipse" case "Scala" => "IntelliJ" case "PHP" | "Ruby"=> "CodeRunner" case _ => "Vim" } println("Use "+ ide +".") } } ஋Λฦ͢͜ͱ΋Ͱ͖·͢ “Use IntelliJ.”͕ग़ྗ͞ΕΔ

Slide 89

Slide 89 text

Functional Programming?

Slide 90

Slide 90 text

ࣸ૾ͷΠϝʔδ • ͋Δू߹ͷཁૉͦΕͧΕʹ

Slide 91

Slide 91 text

ࣸ૾ͷΠϝʔδ • ͋Δू߹ͷཁૉͦΕͧΕʹ • ԿΒ͔ͷޮՌΛద༻͢Δ͜ͱͰ

Slide 92

Slide 92 text

ࣸ૾ͷΠϝʔδ • ͋Δू߹ͷཁૉͦΕͧΕʹ • ԿΒ͔ͷޮՌΛద༻͢Δ͜ͱͰ • ৽͍͠ू߹Λͭ͘Δ

Slide 93

Slide 93 text

ࣸ૾ͷΠϝʔδ x1 x2 x3

Slide 94

Slide 94 text

ࣸ૾ͷΠϝʔδ x1 x2 x3 function

Slide 95

Slide 95 text

ࣸ૾ͷΠϝʔδ x1 x2 x3 y1 function

Slide 96

Slide 96 text

ࣸ૾ͷΠϝʔδ x1 x2 x3 y1 function function

Slide 97

Slide 97 text

ࣸ૾ͷΠϝʔδ x1 x2 x3 y1 y2 y3 function function

Slide 98

Slide 98 text

ͨͱ͑͹SNSͰ ڞ௨ͷ༑ਓΛݟ͚ͭΔͱ͖

Slide 99

Slide 99 text

ڞ௨ͷ༑ਓΛݟ͚ͭΔ ࣗ෼ͷ༑ਓ ༑ਓͷ༑ਓ

Slide 100

Slide 100 text

ڞ௨ͷ༑ਓΛݟ͚ͭΔ ࣗ෼ͷ༑ਓ ༑ਓͷ༑ਓ

Slide 101

Slide 101 text

ڞ௨ͷ༑ਓΛݟ͚ͭΔ ࣗ෼ͷ༑ਓ ༑ਓͷ༑ਓ

Slide 102

Slide 102 text

A͘Μͱͷ ڞ௨ͷ༑ਓΛݟ͚ͭΔ ͢΂ͯͷ Ϣʔβʔ

Slide 103

Slide 103 text

A͘Μͱͷ ڞ௨ͷ༑ਓΛݟ͚ͭΔ friends(me) ͢΂ͯͷ Ϣʔβʔ

Slide 104

Slide 104 text

A͘Μͱͷ ڞ௨ͷ༑ਓΛݟ͚ͭΔ friends(me) ͢΂ͯͷ Ϣʔβʔ ࢲͷ༑ਓ

Slide 105

Slide 105 text

A͘Μͱͷ ڞ௨ͷ༑ਓΛݟ͚ͭΔ friends(me) ͢΂ͯͷ Ϣʔβʔ friends(A) ࢲͷ༑ਓ

Slide 106

Slide 106 text

A͘Μͱͷ ڞ௨ͷ༑ਓΛݟ͚ͭΔ friends(me) ͢΂ͯͷ Ϣʔβʔ friends(A) ࢲͷ༑ਓ

Slide 107

Slide 107 text

A͘Μͱͷ ڞ௨ͷ༑ਓΛݟ͚ͭΔ friends(me) ͢΂ͯͷ Ϣʔβʔ friends(A) ࢲͷ༑ਓ ڞ௨ ͷ༑ਓ

Slide 108

Slide 108 text

ؔ਺ܕϓϩάϥϛϯά • એݴܕϓϩάϥϛϯά • ؔ਺͸ୈҰڃΦϒδΣΫτ • λʢϥϜμʣ • ࢀরಁաੑ • ෭࡞༻ͷͳ͍ؔ਺ɺࣜ • ஗ԆධՁ • Ϟφυ

Slide 109

Slide 109 text

͜ΕΒͷཧ࿦ΛॳΊͯฉ͍ͯ ཧղͰ͖·͔͢ʁ

Slide 110

Slide 110 text

ղͤ͵ ϞφυͬͯͳΜͩΑ(ʋ´ω`)

Slide 111

Slide 111 text

ؔ਺ܕΛΠϝʔδ͢ΔͨΊʹ͸ • ߴߍͰͳΒͬͨू߹Λࢥ͍ग़͠·͠ΐ͏

Slide 112

Slide 112 text

Collection API

Slide 113

Slide 113 text

Collectionʢࣸ૾ʣΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 114

Slide 114 text

Collectionʢࣸ૾ʣΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 115

Slide 115 text

foreach scala> val langs = List("Java", "Scala", "PHP") langs: List[String] = List(Java, Scala, PHP)

Slide 116

Slide 116 text

foreach scala> val langs = List("Java", "Scala", "PHP") langs: List[String] = List(Java, Scala, PHP) ListΛͭ͘Γ·͢

Slide 117

Slide 117 text

foreach scala> val langs = List("Java", "Scala", "PHP") langs: List[String] = List(Java, Scala, PHP) scala> langs.foreach ( ) ListΛͭ͘Γ·͢

Slide 118

Slide 118 text

foreach scala> val langs = List("Java", "Scala", "PHP") langs: List[String] = List(Java, Scala, PHP) scala> langs.foreach ( x => println(x) ) ListΛͭ͘Γ·͢

Slide 119

Slide 119 text

foreach scala> val langs = List("Java", "Scala", "PHP") langs: List[String] = List(Java, Scala, PHP) scala> langs.foreach ( x => println(x) ) ListΛͭ͘Γ·͢ ؔ਺ϦςϥϧΛ౉͠·͢

Slide 120

Slide 120 text

foreach scala> val langs = List("Java", "Scala", "PHP") langs: List[String] = List(Java, Scala, PHP) scala> langs.foreach ( x => println(x) ) Java Scala PHP ListΛͭ͘Γ·͢ ؔ਺ϦςϥϧΛ౉͠·͢ Listͷઌ಄͔ΒॱʹɺҾ਺ʹड͚औͬͨؔ਺Λద༻͠·͢

Slide 121

Slide 121 text

Collectionʢࣸ૾ʣΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 122

Slide 122 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Slide 123

Slide 123 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 1͔Β10·ͰͷListΛͭ͘Δ

Slide 124

Slide 124 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( ) 1͔Β10·ͰͷListΛͭ͘Δ

Slide 125

Slide 125 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( ) 1͔Β10·ͰͷListΛͭ͘Δ

Slide 126

Slide 126 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( (x0, x1) => x0 + x1 ) res1: Int = 55 1͔Β10·ͰͷListΛͭ͘Δ

Slide 127

Slide 127 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( (x0, x1) => x0 + x1 ) res1: Int = 55 1͔Β10·ͰͷListΛͭ͘Δ Ҿ਺Λ2ͭऔΔؔ਺ϦςϥϧΛ౉͢

Slide 128

Slide 128 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( (x0, x1) => x0 + x1 ) res1: Int = 55 1͔Β10·ͰͷListΛͭ͘Δ Ҿ਺Λ2ͭऔΔؔ਺ϦςϥϧΛ౉͢

Slide 129

Slide 129 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( (x0, x1) => x0 + x1 ) res1: Int = 55 1͔Β10·ͰͷListΛͭ͘Δ Ҿ਺Λ2ͭऔΔؔ਺ϦςϥϧΛ౉͢

Slide 130

Slide 130 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( (x0, x1) => x0 + x1 ) res1: Int = 55 1͔Β10·ͰͷListΛͭ͘Δ Ҿ਺Λ2ͭऔΔؔ਺ϦςϥϧΛ౉͢

Slide 131

Slide 131 text

reduce scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> range.reduce( (x0, x1) => x0 + x1 ) res1: Int = 55 1͔Β10·ͰͷListΛͭ͘Δ Ҿ਺Λ2ͭऔΔؔ਺ϦςϥϧΛ౉͢ ઌ಄͔Βॱʹɺܭࢉ݁Ռͱ࣍ͷ஋Λ ౉͞Εͨؔ਺Ϧςϥϧʹద༻ͨ݁͠ՌΛฦ͢

Slide 132

Slide 132 text

Collectionʢࣸ૾ʣΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 133

Slide 133 text

filter scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Slide 134

Slide 134 text

filter scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val odd = range.filter( )

Slide 135

Slide 135 text

filter scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val odd = range.filter( x => x % 2 == 1 ) BooleanΛฦؔ͢਺ϦςϥϧΛ౉͢

Slide 136

Slide 136 text

filter scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val odd = range.filter( x => x % 2 == 1 ) scala> val odd = range.filter( x => x % 2 == 1 ) odd: List[Int] = List(1, 3, 5, 7, 9) BooleanΛฦؔ͢਺ϦςϥϧΛ౉͢ ح਺ͷίϨΫγϣϯ͕࡞ΒΕͨ

Slide 137

Slide 137 text

Collectionʢࣸ૾ʣΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 138

Slide 138 text

map scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Slide 139

Slide 139 text

map scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val twoTimes = range.map( )

Slide 140

Slide 140 text

map scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val twoTimes = range.map( x => x * 2 )

Slide 141

Slide 141 text

map scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val twoTimes = range.map( x => x * 2 ) ஋Λड͚औΓɺ৽͍͠஋Λฦؔ͢਺ϦςϥϧΛ౉͢

Slide 142

Slide 142 text

map scala> val range = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) range: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val twoTimes = range.map( x => x * 2 ) twoTimes: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20) ஋Λड͚औΓɺ৽͍͠஋Λฦؔ͢਺ϦςϥϧΛ౉͢ ΋ͱͷίϨΫγϣϯͷ஋ΛͦΕͧΕ2ഒͨ͠ίϨΫγϣϯ͕ͭ͘ΒΕͨ

Slide 143

Slide 143 text

Practice!

Slide 144

Slide 144 text

࿅श໰୊ • 1͔Β100·Ͱͷ੔਺Λग़ྗ͢Δ • 1͔Β100·Ͱͷ੔਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷ੔਺ͰFizzBuzz

Slide 145

Slide 145 text

࿅श໰୊ • 1͔Β100·Ͱͷ੔਺Λग़ྗ͢Δ • 1͔Β100·Ͱͷ੔਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷ੔਺ͰFizzBuzz

Slide 146

Slide 146 text

CollectionΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce, fold • filter • map

Slide 147

Slide 147 text

1͔Β100·Ͱͷ੔਺Λग़ྗ • ·ͣ͸͓޷͖ͳݴޠͰॻ͍ͯΈ͍ͯͩ͘͞

Slide 148

Slide 148 text

1͔Β100·Ͱͷ੔਺Λग़ྗ # PHP

Slide 149

Slide 149 text

1͔Β100·Ͱͷ੔਺Λग़ྗ # Scala object Print { def main(args: Array[String]) { (1 to 100).foreach(println) } }

Slide 150

Slide 150 text

1͔Β100·Ͱͷ੔਺Λग़ྗ # Scala object Print { def main(args: Array[String]) { (1 to 100).foreach(println) } } x => println(x) ͷΑ͏ʹؔ਺͕ ஋ΛऔΔ͜ͱ͕໌Β͔ͳͱ͖͸লུՄ

Slide 151

Slide 151 text

࿅श໰୊ • 1͔Β100·Ͱͷ੔਺Λग़ྗ͢Δ • 1͔Β100·Ͱͷ੔਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷ੔਺ͰFizzBuzz

Slide 152

Slide 152 text

CollectionΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 153

Slide 153 text

1͔Β100ͷ੔਺Λͨ͠߹ΘͤΔ # PHP

Slide 154

Slide 154 text

1͔Β100ͷ੔਺Λͨ͠߹ΘͤΔ # Sclala object Sum { def main(args: Array[String]) { val sum = (1 to 100).reduce((x0, x1) => x0 + x1) println(sum) } }

Slide 155

Slide 155 text

1͔Β100ͷ੔਺Λͨ͠߹ΘͤΔ # Sclala object Sum { def main(args: Array[String]) { val sum = (1 to 100).reduce((x0, x1) => x0 + x1) println(sum) } } RangeΛ͔ͬ͜ͰғΜͰ࢖͑·͢

Slide 156

Slide 156 text

1͔Β100ͷ੔਺Λͨ͠߹ΘͤΔ # Sclala object Sum { def main(args: Array[String]) { val sum = (x0: Int, x1: Int) => x0 + x1 val result = (1 to 100).reduce(sum) println(result) } }

Slide 157

Slide 157 text

1͔Β100ͷ੔਺Λͨ͠߹ΘͤΔ # Sclala object Sum { def main(args: Array[String]) { val sum = (x0: Int, x1: Int) => x0 + x1 val result = (1 to 100).reduce(sum) println(result) } } ؔ਺Λม਺ʹ୅ೖͯ͠ɺ ͜ΕΛ౉͢͜ͱ΋ग़དྷ·͢

Slide 158

Slide 158 text

࿅श໰୊ • 1͔Β100·Ͱͷ੔਺Λग़ྗ͢Δ • 1͔Β100·Ͱͷ੔਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷ੔਺ͰFizzBuzz

Slide 159

Slide 159 text

CollectionΛૢ࡞͢Δ 4ͭͷϝιου • foreach • reduce • filter • map

Slide 160

Slide 160 text

1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ # PHP

Slide 161

Slide 161 text

1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ # Scala object SumEven { def main(args: Array[String]) { val sum = (x0: Int, x1: Int) => x0 + x1 val isEven = (x: Int) => x % 2 == 0 // (1 to 100).filter(x => x % 2 == 0).reduce(_ + _) val result = (1 to 100).filter(isEven).reduce(sum) println(result) } } ίϨΫγϣϯϝιουΛνΣʔϯ͢Δ͜ͱ΋Ͱ͖·͢

Slide 162

Slide 162 text

1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ # Scala object SumEven { def main(args: Array[String]) { val result = (2 to 100 by 2).sum println(result) } }

Slide 163

Slide 163 text

1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ # Scala object SumEven { def main(args: Array[String]) { val result = (2 to 100 by 2).sum println(result) } } ίϨΫγϣϯʹ͸σϑΥϧτͰ ଟ͘ͷϝιου͕༻ҙ͞Ε͍ͯ·͢

Slide 164

Slide 164 text

࿅श໰୊ • 1͔Β100·Ͱͷ੔਺Λग़ྗ͢Δ • 1͔Β100·Ͱͷ੔਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷۮ਺Λͨ͠߹ΘͤΔ • 1͔Β100·Ͱͷ੔਺ͰFizzBuzz

Slide 165

Slide 165 text

FizzBuzzͷϧʔϧ • 1͔Β100·Ͱͷ੔਺Λग़ྗ͢Δ • ͨͩ͠3ͷഒ਺ͷͱ͖͸Fizz • 5ͷഒ਺ͷͱ͖͸Buzz • 3ͱ5ͷഒ਺ͷͱ͖͸FizzBuzz • ਺ࣈΛจࣈྻʹஔ͖͔͑ͯग़ྗ͢Δ

Slide 166

Slide 166 text

FizzBuzzͷΠϝʔδ • 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz,
 11, Fizz, 13, 14, FizzBuzz, …

Slide 167

Slide 167 text

1͔Β100·Ͱͷ੔਺ͰFizzBuzz # PHP

Slide 168

Slide 168 text

1͔Β100·Ͱͷ੔਺ͰFizzBuzz # Scala object FizzBuzz { def main(args:Array[String]) = { val fizzBuzz = (x: Int) => ( x%3, x%5 ) match { case (0, 0) => "FizzBuzz" case (0, _) => "Fizz" case (_, 0) => "Buzz" case _ => x.toString } val result = (1 to 100).map(fizzBuzz).mkString(",") println(result) } }

Slide 169

Slide 169 text

1͔Β100·Ͱͷ੔਺ͰFizzBuzz # Scala object FizzBuzz { def main(args:Array[String]) = { val fizzBuzz = (x: Int) => ( x%3, x%5 ) match { case (0, 0) => "FizzBuzz" case (0, _) => "Fizz" case (_, 0) => "Buzz" case _ => x.toString } val result = (1 to 100).map(fizzBuzz).mkString(",") println(result) } } xΛ3Ͱׂͬͨ͋·Γͱɺ 5Ͱׂͬͨ͋·ΓͷTuple

Slide 170

Slide 170 text

1͔Β100·Ͱͷ੔਺ͰFizzBuzz # Scala object FizzBuzz { def main(args:Array[String]) = { val fizzBuzz = (x: Int) => ( x%3, x%5 ) match { case (0, 0) => "FizzBuzz" case (0, _) => "Fizz" case (_, 0) => "Buzz" case _ => x.toString } val result = (1 to 100).map(fizzBuzz).mkString(",") println(result) } } xΛ3Ͱׂͬͨ͋·Γͱɺ 5Ͱׂͬͨ͋·ΓͷTuple Tupleͷ஋ͰύλʔϯϚον ͢Δ͜ͱ΋Ͱ͖Δ

Slide 171

Slide 171 text

1͔Β100·Ͱͷ੔਺ͰFizzBuzz # Scala object FizzBuzz { def main(args:Array[String]) = { val fizzBuzz = (x: Int) => ( x%3, x%5 ) match { case (0, 0) => "FizzBuzz" case (0, _) => "Fizz" case (_, 0) => "Buzz" case _ => x.toString } val result = (1 to 100).map(fizzBuzz).mkString(",") println(result) } } fizzBuzzม਺ʹ౉͞Ε͍ͯΔ ͷ͸ؔ਺Ϧςϥϧ

Slide 172

Slide 172 text

Recursive

Slide 173

Slide 173 text

࠶ؼͷ͸ͳ͠ • ͨͱ͑͹ɺ͋Δؔ਺͕ͦͷهड़ͷͳ͔Ͱ
 ࣗ෼ࣗ৴Λؔ਺ͱͯ͠ݺͼग़͢͜ͱɻ
 
 def recursive = {
 …
 recursive(xx)
 }

Slide 174

Slide 174 text

຤ඌ࠶ؼ • ؔ਺ͷఆٛͰɺ࠶ؼΛ༻͍Δͱ͖͸ɺ
 ࣗ෼ࣗ਎ͷݺͼग़͠͸ɺ
 ؔ਺ఆٛͷͷ࠷ޙʹ͢Δɻ • ຤ඌ࠶ؼҎ֎ͷ࠶ؼͰ͸ɺ
 ࠶ؼݺͼग़͠ͷͨͼʹελοΫΛͭ͘ΔͨΊ
 ΦʔόʔϑϩʔΛى͜͢ةݥ͕͋Γ·͢ɻ

Slide 175

Slide 175 text

֊৐ܭࢉͷྫ • ࣗવ਺ n ͷ֊৐ެࣜ
 n! = n * (n - 1) * … * 1 • ͜ΕΛܭࢉ͢Δؔ਺Λఆٛ͢Δ
 ʢ 0! = 1 ʣ

Slide 176

Slide 176 text

֊৐ܭࢉͷྫ object Untitled { def main(args:Array[String]) = { def factorial(n:Int):Int = if (n < 1) 1 else (n * factorial(n - 1)) println(factorial(1)) // 1 println(factorial(2)) // 2 println(factorial(3)) // 6 println(factorial(4)) // 24 } }

Slide 177

Slide 177 text

֊৐ܭࢉͷྫ object Untitled { def main(args:Array[String]) = { def factorial(n:Int):Int = if (n < 1) 1 else (n * factorial(n - 1)) println(factorial(1)) // 1 println(factorial(2)) // 2 println(factorial(3)) // 6 println(factorial(4)) // 24 } } ຤ඌ࠶ؼ͡Όͳ͍

Slide 178

Slide 178 text

֊৐ܭࢉʢ຤ඌ࠶ؼʣ object Untitled { def main(args:Array[String]) = { def factorial(n:Int, acc:Int = 1):Int = if (n < 1) acc else (factorial(n - 1, n * acc)) println(factorial(1)) // 1 println(factorial(2)) // 2 println(factorial(3)) // 6 println(factorial(4)) // 24 } }

Slide 179

Slide 179 text

֊৐ܭࢉʢ຤ඌ࠶ؼʣ object Untitled { def main(args:Array[String]) = { def factorial(n:Int, acc:Int = 1):Int = if (n < 1) acc else (factorial(n - 1, n * acc)) println(factorial(1)) // 1 println(factorial(2)) // 2 println(factorial(3)) // 6 println(factorial(4)) // 24 } } ΞΩϡϜϨʔλͷಋೖ

Slide 180

Slide 180 text

֊৐ܭࢉʢ຤ඌ࠶ؼʣ object Untitled { def main(args:Array[String]) = { def factorial(n:Int, acc:Int = 1):Int = if (n < 1) acc else (factorial(n - 1, n * acc)) println(factorial(1)) // 1 println(factorial(2)) // 2 println(factorial(3)) // 6 println(factorial(4)) // 24 } } ΞΩϡϜϨʔλͷಋೖ ͜ΕͰ຤ඌ࠶ؼʹͳͬͨ

Slide 181

Slide 181 text

Practice!

Slide 182

Slide 182 text

ϑΟϘφον਺ • n ൪໨ͷϑΟϘφον਺ΛF_nͰද͢ͱ • F_0 = 0 • F_1 = 1 • F_n+2 = F_n + F_n+1 (n >= 0)

Slide 183

Slide 183 text

ϑΟϘφον਺ྻͷΠϝʔδ • 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …

Slide 184

Slide 184 text

ϑΟϘφον਺ͷ໰୊ • ϑΟϘφον਺ͷ n ൪໨ͷ஋Λ
 ٻΊΔؔ਺Λͭ͘Δ
 
 fib(0) = 0
 fib(1) = 1
 fib(2) = 1
 fib(3) = 2

Slide 185

Slide 185 text

ϑΟϘφον਺ͷྫ object Fibonacci { def main(args:Array[String]) = { def fib(n: Int): Int = if(n < 1) 0 else n match { case 1 => 1 case 2 => 1 case x => fib(x-1) + fib(x-2) } val fibString = (1 to 10).map(fib).mkString(", ") println(fibString) // 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } } ຤ඌ࠶ؼ͡Όͳ͍

Slide 186

Slide 186 text

ϑΟϘφον਺ʢ຤ඌ࠶ؼʣ object Fibonacci { def main(args:Array[String]) = { def fibList(lim: Int): List[Int] = { def fib0(lim: Int, fls: List[Int]): List[Int] = { if (lim < 1) fls else { fls match { case Nil => fib0(lim-1, 1 :: Nil) case x0 :: Nil => fib0(lim-1, 1 :: fls) case x1 :: x0 :: ls => fib0(lim-1, (x0 + x1) :: x1 :: x0 :: ls) } } } fib0(lim, Nil).reverse } def fib(n: Int): Int = fibList(n).last } } fibListͷ಺෦ʹؔ਺Λ࡞Δ fib0ͷͳ͔Ͱ͸ٯॱͰListΛ͍ͭͬͯ͘ΔͨΊɺ࠷ޙʹ໭͢

Slide 187

Slide 187 text

ϑΟϘφον਺ྻʢ lazy val ʣ val fibList = (lim: Int) => { lazy val fib0:(Int, List[Int]) => List[Int] = (lim:Int, fls:List[Int]) => { if (lim < 1) fls else { fls match { case Nil => fib0(lim-1, 1 :: Nil) case x0 :: Nil => fib0(lim-1, 1 :: fls) case x1 :: x0 :: ls => fib0(lim-1, (x0 + x1) :: x1 :: x0 :: ls) } } } fib0(lim, Nil).reverse } val fib = (n: Int) => fibList(n).last .lastOption.getOrElse(0)

Slide 188

Slide 188 text

͓͠·͍