狠狠撸

狠狠撸Share a Scribd company logo
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	 Main
Hello,	 World!
Java よりもお手軽

hello.scala
println("Hello,	 World!")


$	 scala	 hello.scala
Hello,	 World!
REPL



$	 scala
scala>	 println("Hello,	 World!")
Hello,	 World!
Java っぽい手続きもふめる
Main.scala
object	 Main	 {
	 	 def	 main(args:	 Array[String])	 {
	 	 	 	 println("Hello,	 World!")
	 	 }
}

$	 scalac	 Main.scala
$	 scala	 Main
Hello,	 World!
型推論

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

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


Scala
val	 list	 =	 new	 ArrayList[String]
型推論
Java
public	 int	 square(int	 x)	 {
	 	 return	 x	 *	 x;
}


Scala
def	 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	 _	 =>	 ""
}
型付きパターン
Java
if	 (x	 instanceof	 String)	 {
	 	 return	 ((String)x).length();
}	 else	 if	 (x	 instanceof	 Integer)	 {
	 	 return	 ((Integer)x).intValue();
...


Scala
x	 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]+)".r
val	 alpha	 =	 "([a-zA-Z]+)".r
args	 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年度卒業生の最高得点
Java
int	 max	 =	 -1;
for	 (Student	 s:	 students)	 {
	 	 if	 (s.gradYear	 ==	 2011)	 {
	 	 	 	 max	 =	 Math.max(max,	 s.score);
	 	 }
}
Scala
students.filter(
	 	 s	 =>	 s.gradYear	 ==	 2011
).map(s	 =>	 s.score).max
高階関数
リストの要素から偶数を取り出し並べ替え
Java
List<Integer>	 evens	 =	 new	 ArrayList<>();
for	 (Integer	 i:	 list)	 {
	 	 if	 (i	 %	 2	 ==	 0)	 {
	 	 	 	 evens.add(i);
	 	 }
}
Collections.sort(evens);

Scala
list.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.html


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

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


E?ective Scala
Twitter 社が公開しているベストプラクティス集
http://twitter.github.com/e?ectivescala/
IDE
IntelliJ IDEA + Scala plugin
http://www.jetbrains.com/idea/


Scala IDE
ecipse のプラグイン
http://scala-ide.org/


Typesafe Scala IDE
Typesafe 社が eclipse と Scala IDE をパッケージング
http://typesafe.com/stack/scala_ide_download

More Related Content

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