More Related Content Similar to Scalaで萌える関数型プログラミング[1.1.RC1] Similar to Scalaで萌える関数型プログラミング[1.1.RC1] (20) Scalaで萌える関数型プログラミング[1.1.RC1]2. 前回までのあらすじ
● 7/9(土)のOITECでScalaについてのLTを
やったのであった!
● 更に7/17(日)オープンラボ備後で完全版の
セッションをやった!
● 今回はその再放送版です
(若干新しい情報を盛り込んだりしてます)
● OITECで実践F#をもらったのでちょっと
なびいたのはここだけの秘密だ!
2/53
3. 今から話す人の
ざっくりとした説明
● 角田裕樹(すみだゆうき)
● Hatena / id:razon
● Twitter / @razon
● ×ラゾン ○レゾン ◎しゾン
● 天領倉敷Scalaの言いだしっぺ
● 本業はJavaプログラマ
その時々で他のことも結構やってるけど…
3/53
4. これからお話しすること
● Scalaってなんぞ
● 関数型プログラミングってなんぞ
● 天領倉敷Scalaって何?
● Scala勉強するのにどうすればいいのさ
● 開発環境とかどんなのがあるのん?
● 時間が余ったらライブコーディングとか?
4/53
6. Scalaってなんぞ?
● スイス連邦工科大学(EPFL)のMartin Odersky
が設計したプログラム言語
● JVM上で動作する
(コンパイルするとJavaのバイトコードになる)
※.NET向け実装をMS支援のもと絶賛開発中
→VisualStudioで開発できるとか(な、なんd(ry
→IKVMベース(.Net上で動くJava実装)
● オブジェクト指向と関数型のハイブリッド
6/53
7. Scalaってなんぞ?
● JVM上で動くと何が嬉しいのん?
→Javaとの相互利用が可能
→Javaの資源(ライブラリ・FW・ミドル)
がそのまま利用可能
・JDBCドライバ
・Servlet/JavaEEコンテナ
・などなど…
7/53
11. 関数型プログラミングってなんぞ?
● 元々はラムダ計算の概念をプログラミング言
語として体現したもの
→理論計算機科学や数理論理学における、
関数の定義と実行を抽象化した計算体系
● ご先祖様はLISP
● 関数がファーストオブジェクト
→関数を変数に格納できる
→関数を引数の値として指定できる
→関数を戻り値として指定できる
11/53
12. 関数型プログラミングってなんぞ?
● 元々はラムダ計算の概念をプログラミング言
語として体現したもの
→理論計算機科学や数理論理学における、
関数の定義と実行を抽象化した計算体系
● ご先祖様はLISP
● 関数がファーストオブジェクト
→関数を変数に格納できる
→関数を引数の値として指定できる
→関数を戻り値として指定できる
● =高階関数!
12/53
13. 関数型プログラミングってなんぞ?
● で、何がうれしいのん?
● 関数型言語といえば、コレクションの操作!
scala> val list = 1 :: 5 :: 2 :: 3 :: 4 :: Nil
list: List[Int] = List(1, 5, 2, 3, 4)
scala> list.filter(_ % 2 == 0)
res0: List[Int] = List(2, 4)
scala> list.sortWith(_ < _)
res1: List[Int] = List(1, 2, 3, 4, 5)
scala> list.map(_ * 2)
res2: List[Int] = List(2, 10, 4, 6, 8)
scala> list.reduceLeft(_ + _)
res3: Int = 15
13/53
14. 関数型プログラミングってなんぞ?
● 入力に対し、関数をチェーンすることで
出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12
14/53
15. 関数型プログラミングってなんぞ?
● 入力に対し、関数をチェーンすることで
出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12
● 手続き型っぽい処理と比べると…
var sum = 0
for (i <- list) {
if (i % 2 == 0) {
sum += i * 2
}
}
15/53
16. 関数型プログラミングってなんぞ?
● 入力に対し、関数をチェーンすることで
出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12
抽出 変換 集計
● 手続き型っぽい処理と比べると…
var sum = 0
for (i <- list) {
if (i % 2 == 0) {
sum += i * 2
}
}
抽出 集計 変換
16/53
18. 関数型プログラミングってなんぞ?
● イミュータブル!
→作成後にその状態を変えることができない
● えっそれ不便じゃね…?
→覚えがありませんか?
→どこかのタイミングでここの変数の値が
おかしくなってエラーが出る
→その変数(状態)が変わる(ことができる)のが原因
18/53
19. 関数型プログラミングってなんぞ?
● イミュータブル!
→作成後にその状態を変えることができない
● えっそれ不便じゃね…?
→覚えがありませんか?
→どこかのタイミングでここの変数の値が
おかしくなってエラーが出る
→その変数(状態)が変わる(ことができる)のが原因
● 関数型らしいコードを書くことで、
変化する状態を最小限にすることができる
(純粋関数型言語のHaskellなどは変数に再代入不可)
19/53
21. 関数型プログラミングってなんぞ?
● イミュータブルの副次的な恩恵
● テストがらくちんになる
(状態を考慮したテストをする必要が
なくなる)
● 並列処理がらくちんになる
状態を持たなければ、スレッドの同期や
ロックなどを考慮する必要がなくなる
→Scalaでは状態を持つ場合でも比較的簡単に並列処理を
行うためのActorライブラリというものもあります
21/53
22. 関数型プログラミングってなんぞ?
● カリー化と部分適用
● カリー化!
scala> def add(x: Int, y: Int) = x + y
add: (x: Int, y: Int)Int
↓
scala> def add(x: Int)(y: Int) = x + y
add: (x: Int)(y: Int)Int
22/53
23. 関数型プログラミングってなんぞ?
● カリー化と部分適用
● カリー化!
scala> def add(x: Int, y: Int) = x + y
add: (x: Int, y: Int)Int
↓
scala> def add(x: Int)(y: Int) = x + y
add: (x: Int)(y: Int)Int
● 部分適用!
scala> def inc = add(1)_
inc: (Int) => Int
● その名のとおり、関数の引数の一部を適用
した新たな関数を作ることができる
23/53
24. 関数型プログラミングってなんぞ?
● 部分適用した関数を使ってみる
scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil
list: List[Int] = List(1, 2, 3, 4, 5)
scala> list.map(inc)
res1: List[Int] = List(2, 3, 4, 5, 6)
24/53
25. 関数型プログラミングってなんぞ?
● 部分適用した関数を使ってみる
scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil
list: List[Int] = List(1, 2, 3, 4, 5)
scala> list.map(inc)
res1: List[Int] = List(2, 3, 4, 5, 6)
● カリー化しなくても、プレースホルダー構文
で!
scala> def add(x: Int, y: Int) = x + y
add: (x: Int, y: Int)Int
scala> list.map(add(1, _))
res2: List[Int] = List(2, 3, 4, 5, 6)
25/53
26. 関数型プログラミングってなんぞ?
● 遅延評価
● lazy val
scala> val v = {println("Hello val !"); 0}
Hello val !
v: Int = 0
scala> lazy val lVal = {println("Hello lazy val !"); 0}
lVal: Int = <lazy>
scala> println(lVal)
Hello lazy val !
0
scala> println(lVal)
0
26/53
27. 関数型プログラミングってなんぞ?
● 遅延評価
● 名前渡し引数
scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil
list: List[Int] = List(1, 2, 3, 4, 5)
scala> val itr = list.iterator
itr: Iterator[Int] = non-empty iterator
scala> def hello(i: => Int) = {
| println("Excel方眼紙爆発しろ " + i)
| println("Excel方眼紙爆発しろ " + i)}
hello: (i: => Int)Unit
scala> hello(itr.next)
Excel方眼紙爆発しろ 1
Excel方眼紙爆発しろ 2
27/53
28. 関数型プログラミングってなんぞ?
● 遅延評価
● Streamによる無限リスト
scala> def makeInc(from: Int): Stream[Int] =
| Stream.cons(from, makeInc(from + 1))
makeInc: (from: Int)Stream[Int]
scala> val inc = makeInc(10)
inc: Stream[Int] = Stream(10, ?)
scala> inc take 5 toList
res11: List[Int] = List(10, 11, 12, 13, 14)
28/53
29. 関数型プログラミングってなんぞ?
● パターンマッチ!
● 型別に振り分けてみる
scala> def judgeType(in: Any) = in match {
| case _: String => "String!"
| case _: Int => "Int!"
| case _ => "Other!"
| }
judgeType: (in: Any)java.lang.String
scala> judgeType("1")
res1: java.lang.String = String!
scala> judgeType(1)
res2: java.lang.String = Int!
scala> judgeType(1 :: Nil)
res3: java.lang.String = Other! 29/53
30. 関数型プログラミングってなんぞ?
● パターンマッチ!
● 定番のFizzBuzz
scala> def fizzbuzz(n: Int) = n match {
| case n if n % 15 == 0 => "fizzbuzz"
| case n if n % 3 == 0 => "fizz"
| case n if n % 5 == 0 => "buzz"
| case _ => n
| }
fizzbuzz: (n: Int)Any
scala> 1 to 20 map fizzbuzz
res1: scala.collection.immutable.IndexedSeq[Any] = Vector(1,
2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14,
fizzbuzz, 16, 17, fizz, 19, buzz)
30/53
31. 関数型プログラミングってなんぞ?
● パターンマッチ!
● CaseClassと組み合わせて
scala> case class Person(name: String, sex: String, age: Int)
defined class Person
scala> def judgePerson(p: Person) = p match {
| case Person(n, s, a) if s == "female" && a < 10 => n + ":幼女"
| case Person(n, s, a) if s == "female" => n + ":ババァ"
| case _ => "後はどうでもいい"
| }
judgePerson: (p: Person)java.lang.String
scala> judgePerson(Person("razonの娘", "female", 2))
res1: java.lang.String = razonの娘:幼女
31/53
33. 天領倉敷Scalaって何?
● 岡山県倉敷市周辺でScalaの勉強会を行う
コミュニティ
● 「天領」…江戸時代における幕府の直轄領
倉敷市民がことあるごとに持ち上げる単語
→正直ウンザリする
→皮肉を込めた(天領倉敷(笑))
● ハッシュタグは「#tkscala」
岡山県内の勉強会コミュニティでも異彩を放つTL
として一部で悪名高い
● 次回は8/20(土)でーす
33/53
35. Scala勉強するのに
どうしたらいいのさ
書籍
● Scalaスケーラブルプログラミング
[コンセプト&コーディング]
● 通称コップ本
● 聖典(Oderskyの著書)
● キッチリ書いてある分難しい
● あと高い(5k近くする)
● が、買う価値はあり
● 9/27に第2版が発売(予定)なので、そちらをどうぞ
35/53
36. Scala勉強するのに
どうしたらいいのさ
書籍
●
Scalaプログラミング入門
● Lift Frameworkの中の人
David Pollakの著書
● 天領倉敷Scalaではこの本を
ベースに学習しています
● コップ本よりは読みやすい
36/53
37. Scala勉強するのに
どうしたらいいのさ
書籍
● プログラミングScala
● 通称バク本
● Twitter APIのリードプログラマーが
書いてる
● 二冊目の本としてオススメの声多し
37/53
38. Scala勉強するのに
どうしたらいいのさ
書籍
●
Scala実践プログラミング
● 日本のScala界の巨匠が結集して
書かれた本
● 新しい(先月出ました)
● 和書なので読みやすい
● 初心者向けはコレが鉄板かと
● 上級者からは「物足りない」の声あり
● ただし、他の本で触れられていない部分
についての解説あり
(デザパタ・限定継続など…)
38/53
39. Scala勉強するのに
どうしたらいいのさ
フォローするべきScalaスーパーエンジニア
● @kmizu
Scalaエバンジェリストといえばこの人
ScalaDaysという世界のScala祭りで発表されてます!
Scalaとか静的型付け vs 動的型付けなどの議論をMatzと繰
り広げる猛者
● @yuroyoro
日本Scala界のスーパースター
最近ではほむほむ言語の中の人として脚光を浴びる
新作言語ウキャスがマジ宇宙語
39/53
40. Scala勉強するのに
どうしたらいいのさ
フォローするべきScalaスーパーエンジニア
● @xuwei_k
Scalaについてのエントリをブログで精力的に書いてる人
(OITEC版の資料でツッコミ頂きましたthx!)
RubyKaigiでMatzに「Scalaの人ですね」的なことを言われ
たとか
● @keisuke_n
日本のScala祭り「Scala座」第一回主催
WebFlavorというScalaフレームワークの作者でもある
大都会岡山クラスタ
天領倉敷Scalaにも何度か来ていただきました
40/53
41. Scala勉強するのに
どうしたらいいのさ
フォローするべきScalaスーパーエンジニア
● その他思いつく限りでのScalaに触れてる方々
(多分取りこぼしがいっぱいありますサーセン)
@a_hisame, @asami224, @bleis, @cooldaemon, @cpp_akira,
@halcat0x15a, @hito_asa, @itoasuka, @j5ik2o,
@kaigaiengineer, @katzchang, @keigoi, @maeda_, @maiha,
@mumoshu, @mzp, @NetPenguin, @nosen, @nouvellelune,
@osiire, @papamitra, @PG_kura, @pomu0325, @rf0444,
@RKTM, @ryugate, @ScalaTohoku, @shomah4a, @syuta,
@takedasoft, @terurou, @tototoshi, @yasushia, @ymnk,
@yoshihiro503
41/53
42. Scala勉強するのに
どうしたらいいのさ
参考にしたいサイトとか
● 本家
http://www.scala-lang.org/
● プログラミング言語Scala 日本語情報サイト
https://sites.google.com/site/scalajp/
● Scala開眼
http://www.h7.dion.ne.jp/~samwyn/Scala/scalaindex.htm
● Scala勉強会@東北
https://sites.google.com/site/scalatohoku/
42/53
44. 開発環境とか
どんなのがあるのん?
エディタ編
●
実はデフォルトで色んなエディタ/IDE用の拡張がついてる
geditとかtextmateとかxcodeとか…
44/53
45. 開発環境とか
どんなのがあるのん?
エディタ編
●
実はデフォルトで色んなエディタ/IDE用の拡張がついてる
geditとかtextmateとかxcodeとか…
● とはいえ、vim or emacs ですよね!
→エディタ宗教戦争だー!
● vim
codefellowとかneocmplecacheで補完が効いたりするらし
いですよ(emacs派なのでわかりませんサーセン←)
● emacs
ENSIMEというのがありますよ奥さん
補完とかリファクタリングとか効いて結構強力
45/53
46. 開発環境とか
どんなのがあるのん?
IDE編
● 以前はIDEサポートが実に残念であった…
● 今では割と大丈夫なクオリティになったとか
● IntelliJ IDEA
昔はこれくらいしかまともに使えるIDEがなかった
→結果、今でも使ってる人が多い(気がする)
sbt(後述)consoleがあるのもステキ
但し、無料版はAPサーバとの統合が無いので注意
46/53
47. 開発環境とか
どんなのがあるのん?
IDE編
● Eclipse
● NetBeans
Java開発に於いては定番ですね
特にEclipseは昔はひっじょーーーーーに残念なクオリティ
をしていましたが、今では結構大丈夫みたいです!
(最近はちょろっとしか触ってないから良くわry)
47/53
48. 開発環境とか
どんなのがあるのん?
IDE編
● Eclipse
● NetBeans
Java開発に於いては定番ですね
特にEclipseは昔はひっじょーーーーーに残念なクオリティ
をしていましたが、今では結構大丈夫みたいです!
(最近はちょろっとしか触ってないから良くわry)
● という訳で、趣味で(というか、自分の手に
馴染むモノを)選んでいいかも?
48/53
49. 開発環境とか
どんなのがあるのん?
ビルドツール編
● sbt(simple-build-tool)
● Scalaのビルドツールはこれが鉄板
● 一部では「酢豚」とか「サバト」の愛称で親しまれる
● mavenのpom.xmlをScalaで書く感じだと言ったら
乱暴だろうか…
(sbtのディレクトリ構成はmaven準拠で、連携可能)
● Javaもビルドできる
● ファイルの更新を検出して自動的にコンパイルしたり
テストコード走らせたりとか
49/53
51. あと最後に
● 魔法少女Scalaちゃん(@scalachan)を
今すぐフォロー!
51/53
53. あと最後に
● 間違えた
一緒にScala
やろうぜ!
53/53