楽々scalaプログラミング

39
楽々 Scala プログラミング 20111017 JJUG, Lab 浅海智晴

Upload: tomoharu-asami

Post on 18-May-2015

3.929 views

Category:

Technology


2 download

TRANSCRIPT

  • 1. Scala2011 1017JJUG, Lab

2. Object-Oriented Programming (OOP) Object- Functional Programming (OFP) 3. Java ( ) Lab XML SmartDoc (XML) Relaxer (XML/Java ) SimpleModeler (Scala DSL ) g3 ( ) g4 (Android ) UML( BP) ( ) Scala (Softbank Creative) 4. Modegramming Style ( DSL ) http://modegramming.blogspot.com/ SimpleModeler http://code.google.com/p/simplemodeler/ g3 http://code.google.com/p/goldenport3/ g4 https://github.com/asami/goldenport-android-library 5. SCALA 6. Scala 7. Scala 3DSL (Domain Specific Language) API Many Core Parallel Everything 8. () 9. List,( ) () ( )( ) 10. pure Lisp Haskell Scala(+scalaz) Lisp, ML, OCaml Parametric polymorphism Subtypepolymorphism 11. DSL (Domain Specific Language) DSL Scala DSL JJUG CCC 2010 Fall http://www.slideshare.net/asami224/scala-dsl 12. val CNN = "http://www.cnn.com"!val YAHOO = "http://www.yahoo.com"!val AMAZON = "http://www.amazon.com"!!def sitelen(url: String): Int = {! import scala.io.Source! val source = scala.io.Source.fromURL(url)! source.getLines.map(_.length).sum!}!scala> sitelen(CNN)!res92: Int = 85569 13. List(CNN, YAHOO, AMAZON).map(sitelen).sum6.3(scala.testing.Benchmark )List(CNN, YAHOO, AMAZON).par.map(sitelen).sum2 (scala.testing.Benchmark) 14. Future Java (java.util.concurrent) Scala (scala.actors) Future 15. import java.util.concurrent._!!val e = Executors.newSingleThreadExecutor!val f: Future[Int] = e.submit(!new Callable[Int] {!def call() = {! sitelen(CNN)!}!})!!f.get!import scala.actors.Futures._!!val length = future { sitelen(CNN) }!length()! 16. Promise Future 17. import scalaz._!import Scalaz._!!// def sitelen(url: String): Int = ...!def sizekind(len: Int) = {! if (len > 10000) "Large" ! else "Small"!}!def sitelenpromise = (sitelen _).promise!def sizekindpromise = (sizekind _).promise!def sitekindpromise = {! sitelenpromise >=> sizekindpromise!}!scala> val p = sitekindpromise(CNN)!res105: scalaz.concurrent.Promise[java.lang.String] = !scala> p.get!res107: java.lang.String = Large! 18. 5 19. 1: y = f(x) 20. def add1(a: Int): Int = a + 1 add1 (Int) => Intscala> add1(3)!res84: Int = 4scala> List(1, 2, 3).map(add1)!res83: List[Int] = List(2, 3, 4)def add(a: Int, b: Int): Int = a + baddx (Int, Int) => Intscala> List(1, 2, 3).map(add)!:34: error: type mismatch;! found : (Int, Int) => Int! required: (Int) => ?! List(1, 2, 3).map(add)! ^! 21. def addc(a: Int)(b: Int): Int = a + baddc (Int) => (Int) => IntInt(Int) => Intscala> val x = List(1, 2, 3).map(addc)!res87: List[(Int) => Int] = List(, , )!scala> x.map(f => f(1))!res89: List[Int] = List(2, 3, 4)! 22. 2: 23. case class()!case class1()!case class2()!case class(1:1, ! 2:2)!!def1(a:) =1()!def2(a:) =2()!!def(a:):= {!( 1(a),! 2(a))!}! 24. def qsort(a: List[Int]): List[Int] = {! a match {!case Nil => Nil!case List(a) => List(a)!case List(a, b) => if (a < b) List(a, b) !else List(b, a)!case _ => {! val small = a.filter(_ < a.head)! val large = a.filter(_ > a.head)! qsort(small) ::: List(a.head) ::: qsort(large)!}! }!}!scala> qsort(List(10, 3, 8, 5, 2, 6))!res142: List[Int] = List(2, 3, 5, 6, 8, 10)! 25. 3: 26. def zeroonetwo(a: Int): List[Int] = {!List(a, a + 1, a + 2)!}mapscala> List(1, 2, 3).map(zeroonetwo)!res138: List[List[Int]] = !List(List(1, 2, 3), List(2, 3, 4), List(3, 4, 5))flatMapscala> List(1, 2, 3).flatMap(zeroonetwo)!res139: List[Int] = List(1, 2, 3, 2, 3, 4, 3, 4,5) 27. foldLeftdef partition5(l: List[Int]) = {! l.foldLeft((List[Int](), List[Int]())) { (xs, x) =>!val (lhs, rhs) = xs!if (x > 5) (lhs, x :: rhs) else (x :: lhs, rhs)! }!}!def partition5(l: List[Int]) = {! ((List[Int](), List[Int]()) /: l) { (xs, x) =>!val (lhs, rhs) = xs!if (x > 5) (lhs, x :: rhs) else (x :: lhs, rhs)! }!}!scala> partition5(List(10, 3, 8, 5, 2, 6))!res130: (List[Int], List[Int]) = !(List(2, 5, 3),List(6, 8, 10))! 28. 4: 29. (referential transparency) (Wikipedia)(persistent data structure) (Wikipedia) Scala Value scala.collection.immutable case class OOPDTO case class 30. case class Person(name: String, email: String)!case class Party(name: String, persons: List[Person])!!val party = Party(!"hobby",! List(Person("Taro", "[email protected]"),!Person("Hanako", "[email protected]")))! 31. 32. 5: Functor ( ) Subgroup () Monoid () Monad ( ) ( ) OOP Visitor, AbstractFactory, TemplateMethod, Memento 33. FunctorList(CNN, YAHOO, AMAZON).map(sitelen)List(86076, 166806, 98089)! Monadfor (x