第2回関数型言語勉強会 大阪
TRANSCRIPT
Java から Scala へ第2回 関数型言語勉強会 大阪
2012-11-24
木虎 直樹 @kitora_naoki
シナジーマーケティング株式会社
プログラマ & インフラエンジニア
Java, Scala, JavaScript, Python
Linux, 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 よりもお手軽
println("Hello, World!")
$ scala hello.scalaHello, World!
hello.scala
REPL
$ scalascala> println("Hello, World!")Hello, World!
Java っぽい手続きもふめる
object Main { def main(args: Array[String]) { println("Hello, World!") }}
$ scalac Main.scala$ scala MainHello, World!
Main.scala
型推論
// Java 6 以前List<String> list = new ArrayList<String>();
// Java 7 以降List<String> list = new ArrayList<>();
val list = new ArrayList[String]
Java
Scala
型推論
public int square(int x) { return x * x;}
def square(x: Int) = x * x
Java
Scala
※ただし、原則として戻り値の型を明示的に宣言することをお勧めします。
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)
強力なパターンマッチ
int monthNumber = 0;switch (month.toLowerCase()) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; ...
Java だと数値と Enum, String などのみ
強力なパターンマッチ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 _ => ""}
コンストラクタパターン
型付きパターン
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
パターンガード
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年度卒業生の最高得点
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
高階関数リストの要素から偶数を取り出し並べ替え
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
その他にも…
遅延評価並列処理、並行処理強力な型システム暗黙の変数、暗黙的型変換XML リテラルと操作メソッドなどなど
学習リソース書籍Scala スケーラブルプログラミング 第2版基本ですhttp://www.amazon.co.jp/dp/4844330845
オンライン学習Functional Programming Principles in ScalaOdersky 教授直々の講義https://www.coursera.org/course/progfun
学習リソースチュートリアルA Tour of Scalaオフィシャルのチュートリアルhttp://docs.scala-lang.org/tutorials/tour/tour-of-scala.html
Scala 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