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

32
Java から Scala へ 第2回 関数型言語勉強会 大阪 2012-11-24

Upload: naoki-kitora

Post on 28-May-2015

2.165 views

Category:

Technology


1 download

TRANSCRIPT

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

Java から Scala へ第2回 関数型言語勉強会 大阪

2012-11-24

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

木虎 直樹 @kitora_naoki

シナジーマーケティング株式会社

プログラマ & インフラエンジニア

Java, Scala, JavaScript, Python

Linux, Web, AP, RDBMS, MTA, DNS, network

自然言語処理、データマイニング

アジャイルサムライ読書会 大阪道場主催

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

関数プログラミング関数型言語に興味があるが触ったことはないまたは少し触ったことがある

対象

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

初心者向け厳密な正確性よりもわかりやすさを優先

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

命令型プログラミング関数プログラミング論理プログラミング

オブジェクト指向プログラミング

プログラミングパラダイム

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

関数プログラミングとは

狭義変更可能 (mutable) な変数、(再) 代入、ループ等の命令型の制御構造を使わずにプログラミングすること

広義関数を中心にプログラミングすること

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

関数プログラミングの関数とは

命令型プログラミングにおける関数ではなく、数学でいうところの関数

y = f(x)入力 x に対して出力 y のただ一つの値を決定する規則が与えられているときに y を x の関数という

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

コードが簡潔になることが多いUnit テストがしやすい(再) 代入がないので、バグの大きな原因の一つがなくなる特に並列処理

数学的な扱いが容易関数の合成式変形

なぜ関数プログラミング?

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

関数型言語

関数プログラミングをしやすくする特徴をもつプログラミング言語

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

オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語JVM 上で動作し、既存の Java のプログラムと容易に連携可能

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

高速に動作実績が多い信頼性の高いライブラリが豊富

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

お手軽さに欠ける

public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } }

$ javac Main.java$ java MainHello, World!

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

Java よりもお手軽

println("Hello, World!")

$ scala hello.scalaHello, World!

hello.scala

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

REPL

$ scalascala> println("Hello, World!")Hello, World!

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

Java っぽい手続きもふめる

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

$ scalac Main.scala$ scala MainHello, World!

Main.scala

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

型推論

// Java 6 以前List<String> list = new ArrayList<String>();

// Java 7 以降List<String> list = new ArrayList<>();

val list = new ArrayList[String]

Java

Scala

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

型推論

public int square(int x) { return x * x;}

def square(x: Int) = x * x

Java

Scala

※ただし、原則として戻り値の型を明示的に宣言することをお勧めします。

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

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...}

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

Java Bean とか

case class Person(name: String, age: Int)

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

強力なパターンマッチ

int monthNumber = 0;switch (month.toLowerCase()) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; ...

Java だと数値と Enum, String などのみ

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

強力なパターンマッチ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 _ => ""}

コンストラクタパターン

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

型付きパターン

x match { case s: String => s.length case i: Int => i...

if (x instanceof String) { return ((String)x).length();} else if (x instanceof Integer) { return ((Integer)x).intValue();...

Java

Scala

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

パターンガード

p match { case Person(name, age) if age >= 20 => "adult" case _ => ""}

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

正規表現パターン

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)}

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

高階関数関数を引数にしたり、戻り値にしたりする関数def using[A](file: File)(f: Reader => A): A = { val r = new FileReader(file) try { f(r) } finally { r.close }}

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

高階関数2011年度卒業生の最高得点

students.filter( s => s.gradYear == 2011).map(s => s.score).max

int max = -1;for (Student s: students) { if (s.gradYear == 2011) { max = Math.max(max, s.score); }}

Java

Scala

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

高階関数リストの要素から偶数を取り出し並べ替え

list.filter(_ % 2 == 0).sortWith(_ < _)

List<Integer> evens = new ArrayList<>();for (Integer i: list) { if (i % 2 == 0) { evens.add(i); }}Collections.sort(evens);

Java

Scala

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

その他にも…

遅延評価並列処理、並行処理強力な型システム暗黙の変数、暗黙的型変換XML リテラルと操作メソッドなどなど

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

学習リソース書籍Scala スケーラブルプログラミング 第2版基本ですhttp://www.amazon.co.jp/dp/4844330845

オンライン学習Functional Programming Principles in ScalaOdersky 教授直々の講義https://www.coursera.org/course/progfun

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

学習リソースチュートリアルA Tour of Scalaオフィシャルのチュートリアルhttp://docs.scala-lang.org/tutorials/tour/tour-of-scala.html

Scala School!Twitter 社が公開してくれているチュートリアルhttp://twitter.github.com/scala_school/

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

学習リソース

その他Scala Style Guideコーディング規約http://docs.scala-lang.org/style/

Effective ScalaTwitter 社が公開しているベストプラクティス集http://twitter.github.com/effectivescala/

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

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