第2回関数型言語勉強会 大阪
Upcoming SlideShare
Loading in...5
×
 

第2回関数型言語勉強会 大阪

on

  • 2,578 views

 

Statistics

Views

Total Views
2,578
Views on SlideShare
2,578
Embed Views
0

Actions

Likes
1
Downloads
3
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

第2回関数型言語勉強会 大阪 第2回関数型言語勉強会 大阪 Presentation Transcript

  • Java から Scala へ 第2回 関数型言語勉強会 大阪 2012-11-24
  • 木虎 直樹 @kitora_naokiシナジーマーケティング株式会社プログラマ & インフラエンジニアJava, Scala, JavaScript, PythonLinux, Web, AP, RDBMS, MTA, DNS, network自然言語処理、データマイニングアジャイルサムライ読書会 大阪道場主催
  • 対象関数プログラミング関数型言語に興味があるが触ったことはないまたは少し触ったことがある
  • 初心者向け厳密な正確性よりもわかりやすさを優先
  • プログラミングパラダイム命令型プログラミング関数プログラミング論理プログラミングオブジェクト指向プログラミング
  • 関数プログラミングとは狭義変更可能 (mutable) な変数、(再) 代入、ループ等の命令型の制御構造を使わずにプログラミングすること広義関数を中心にプログラミングすること
  • 関数プログラミングの関数とは命令型プログラミングにおける関数ではなく、数学でいうところの関数y = f(x)入力 x に対して出力 y のただ一つの値を決定する規則が与えられているときに y を x の関数という
  • なぜ関数プログラミング?コードが簡潔になることが多いUnit テストがしやすい(再) 代入がないので、バグの大きな原因の一つがなくなる 特に並列処理数学的な扱いが容易 関数の合成 式変形
  • 関数型言語関数プログラミングをしやすくする特徴をもつプログラミング言語
  • オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語JVM 上で動作し、既存の Javaのプログラムと容易に連携可能
  • 高速に動作実績が多い信頼性の高いライブラリが豊富
  • お手軽さに欠けるpublic class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } }$ javac Main.java$ java MainHello, World!
  • Java よりもお手軽hello.scalaprintln("Hello, World!")$ scala hello.scalaHello, World!
  • REPL$ scalascala> println("Hello, World!")Hello, World!
  • Java っぽい手続きもふめるMain.scalaobject Main { def main(args: Array[String]) { println("Hello, World!") }}$ scalac Main.scala$ scala MainHello, World!
  • 型推論Java// Java 6 以前List<String> list = new ArrayList<String>();// Java 7 以降List<String> list = new ArrayList<>();Scalaval list = new ArrayList[String]
  • 型推論Javapublic int square(int x) { return x * x;}Scaladef square(x: Int) = x * x※ただし、原則として戻り値の型を明示的に宣言することをお勧めします。
  • Java Bean とかpublic class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return String.format("Person(%s,%d)", name, age); } ...snip...}
  • Java Bean とかcase class Person(name: String, age: Int)
  • 強力なパターンマッチJava だと数値と Enum, String などのみint monthNumber = 0;switch (month.toLowerCase()) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; ...
  • 強力なパターンマッチval monthNumber = month.toLowerCase match { case "january" => 1 case "february" => 2 ... snip ...コンストラクタパターンcase class Person(name: String, age: Int)val p = Person("duke", 17)val name = p match { case Person(name, age) => name case _ => ""}
  • 型付きパターンJavaif (x instanceof String) { return ((String)x).length();} else if (x instanceof Integer) { return ((Integer)x).intValue();...Scalax match { case s: String => s.length case i: Int => i...
  • パターンガードp match { case Person(name, age) if age >= 20 => "adult" case _ => ""}
  • 正規表現パターンval numeral = "([0-9]+)".rval alpha = "([a-zA-Z]+)".rargs match { case numeral(n) => println("numeral: " + n) case alpha(s) => println("alphabet: " + s) case s => println("other: " + s)}
  • 高階関数関数を引数にしたり、戻り値にしたりする関数def using[A](file: File)(f: Reader => A): A = { val r = new FileReader(file) try { f(r) } finally { r.close }}
  • 高階関数2011年度卒業生の最高得点Javaint max = -1;for (Student s: students) { if (s.gradYear == 2011) { max = Math.max(max, s.score); }}Scalastudents.filter( s => s.gradYear == 2011).map(s => s.score).max
  • 高階関数リストの要素から偶数を取り出し並べ替えJavaList<Integer> evens = new ArrayList<>();for (Integer i: list) { if (i % 2 == 0) { evens.add(i); }}Collections.sort(evens);Scalalist.filter(_ % 2 == 0).sortWith(_ < _)
  • その他にも…遅延評価並列処理、並行処理強力な型システム暗黙の変数、暗黙的型変換XML リテラルと操作メソッドなどなど
  • 学習リソース 書籍 Scala スケーラブルプログラミング 第2版 基本です http://www.amazon.co.jp/dp/4844330845 オンライン学習 Functional Programming Principles in Scala Odersky 教授直々の講義 https://www.coursera.org/course/progfun
  • 学習リソースチュートリアルA Tour of Scalaオフィシャルのチュートリアルhttp://docs.scala-lang.org/tutorials/tour/tour-of-scala.htmlScala School!Twitter 社が公開してくれているチュートリアルhttp://twitter.github.com/scala_school/
  • 学習リソースその他Scala Style Guideコーディング規約http://docs.scala-lang.org/style/Effective ScalaTwitter 社が公開しているベストプラクティス集http://twitter.github.com/effectivescala/
  • IDEIntelliJ IDEA + Scala pluginhttp://www.jetbrains.com/idea/Scala IDEecipse のプラグインhttp://scala-ide.org/Typesafe Scala IDETypesafe 社が eclipse と Scala IDE をパッケージングhttp://typesafe.com/stack/scala_ide_download