SlideShare a Scribd company logo
1 of 32
Download to read offline
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/


Effective Scala
Twitter 社が公開しているベストプラクティス集
http://twitter.github.com/effectivescala/
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

Viewers also liked (8)

命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪
 
Developers summit 2016_kansai
Developers summit 2016_kansaiDevelopers summit 2016_kansai
Developers summit 2016_kansai
 
関数プログラミングことはじめ
関数プログラミングことはじめ関数プログラミングことはじめ
関数プログラミングことはじめ
 
Scala kansai summit-2016
Scala kansai summit-2016Scala kansai summit-2016
Scala kansai summit-2016
 
Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要Docker基礎+docker0.9, 0.10概要
Docker基礎+docker0.9, 0.10概要
 
機械学習とデータ分析プロセス
機械学習とデータ分析プロセス機械学習とデータ分析プロセス
機械学習とデータ分析プロセス
 
32 Ways a Digital Marketing Consultant Can Help Grow Your Business
32 Ways a Digital Marketing Consultant Can Help Grow Your Business32 Ways a Digital Marketing Consultant Can Help Grow Your Business
32 Ways a Digital Marketing Consultant Can Help Grow Your Business
 

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

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)
Masahiro Hayashi
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
 

Similar to 第2回関数型言語勉強会 大阪 (20)

ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
ゼロから始めるScala文法 (再)
ゼロから始めるScala文法 (再)ゼロから始めるScala文法 (再)
ゼロから始めるScala文法 (再)
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
Introduction Xtend
Introduction XtendIntroduction Xtend
Introduction Xtend
 
Java8から始める関数型プログラミング
Java8から始める関数型プログラミングJava8から始める関数型プログラミング
Java8から始める関数型プログラミング
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

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