Your SlideShare is downloading. ×
Scalaで萌える関数型プログラミング[1.1.RC1]
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Scalaで萌える関数型プログラミング[1.1.RC1]

1,810
views

Published on

Published in: Technology

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,810
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
9
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Scala会議倉敷サテライト Scalaで萌える関数型プログラミング [1.1.RC1] 1/53
  • 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
  • 5. Scalaってなんぞ? 5/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
  • 8. Scalaってなんぞ?● ちゃんとした所で使われてんの? →使われてます! 8/53
  • 9. Scalaってなんぞ?● ちゃんとした所で使われてんの? →使われてます! 9/53
  • 10. 関数型プログラミング ってなんぞ? 10/53
  • 11. 関数型プログラミングってなんぞ?● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系● ご先祖様はLISP● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる 11/53
  • 12. 関数型プログラミングってなんぞ?● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系● ご先祖様はLISP● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる● =高階関数! 12/53
  • 13. 関数型プログラミングってなんぞ?● で、何がうれしいのん?● 関数型言語といえば、コレクションの操作!scala> val list = 1 :: 5 :: 2 :: 3 :: 4 :: Nillist: 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 = 0for (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 = 0for (i <- list) { if (i % 2 == 0) { sum += i * 2 }} 抽出 集計 変換 16/53
  • 17. 関数型プログラミングってなんぞ?● イミュータブル! →作成後にその状態を変えることができない 17/53
  • 18. 関数型プログラミングってなんぞ?● イミュータブル! →作成後にその状態を変えることができない● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因 18/53
  • 19. 関数型プログラミングってなんぞ?● イミュータブル! →作成後にその状態を変えることができない● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因● 関数型らしいコードを書くことで、 変化する状態を最小限にすることができる (純粋関数型言語のHaskellなどは変数に再代入不可) 19/53
  • 20. 関数型プログラミングってなんぞ?● イミュータブルの副次的な恩恵● テストがらくちんになる (状態を考慮したテストをする必要が なくなる) 20/53
  • 21. 関数型プログラミングってなんぞ?● イミュータブルの副次的な恩恵● テストがらくちんになる (状態を考慮したテストをする必要が なくなる)● 並列処理がらくちんになる 状態を持たなければ、スレッドの同期や ロックなどを考慮する必要がなくなる →Scalaでは状態を持つ場合でも比較的簡単に並列処理を 行うためのActorライブラリというものもあります 21/53
  • 22. 関数型プログラミングってなんぞ?● カリー化と部分適用● カリー化!scala> def add(x: Int, y: Int) = x + yadd: (x: Int, y: Int)Int↓scala> def add(x: Int)(y: Int) = x + yadd: (x: Int)(y: Int)Int 22/53
  • 23. 関数型プログラミングってなんぞ?● カリー化と部分適用● カリー化!scala> def add(x: Int, y: Int) = x + yadd: (x: Int, y: Int)Int↓scala> def add(x: Int)(y: Int) = x + yadd: (x: Int)(y: Int)Int● 部分適用!scala> def inc = add(1)_inc: (Int) => Int● その名のとおり、関数の引数の一部を適用 した新たな関数を作ることができる 23/53
  • 24. 関数型プログラミングってなんぞ?● 部分適用した関数を使ってみるscala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nillist: 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 :: Nillist: 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 + yadd: (x: Int, y: Int)Intscala> list.map(add(1, _))res2: List[Int] = List(2, 3, 4, 5, 6) 25/53
  • 26. 関数型プログラミングってなんぞ?● 遅延評価● lazy valscala> val v = {println("Hello val !"); 0}Hello val !v: Int = 0scala> lazy val lVal = {println("Hello lazy val !"); 0}lVal: Int = <lazy>scala> println(lVal)Hello lazy val !0scala> println(lVal)0 26/53
  • 27. 関数型プログラミングってなんぞ?● 遅延評価● 名前渡し引数scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nillist: List[Int] = List(1, 2, 3, 4, 5)scala> val itr = list.iteratoritr: Iterator[Int] = non-empty iteratorscala> def hello(i: => Int) = { | println("Excel方眼紙爆発しろ " + i) | println("Excel方眼紙爆発しろ " + i)}hello: (i: => Int)Unitscala> hello(itr.next)Excel方眼紙爆発しろ 1Excel方眼紙爆発しろ 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 toListres11: 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.Stringscala> 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. 関数型プログラミングってなんぞ?● パターンマッチ!● 定番のFizzBuzzscala> 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)Anyscala> 1 to 20 map fizzbuzzres1: 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 Personscala> 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.Stringscala> judgePerson(Person("razonの娘", "female", 2))res1: java.lang.String = razonの娘:幼女 31/53
  • 32. 天領倉敷Scala って何? 32/53
  • 33. 天領倉敷Scalaって何?● 岡山県倉敷市周辺でScalaの勉強会を行う コミュニティ● 「天領」…江戸時代における幕府の直轄領 倉敷市民がことあるごとに持ち上げる単語 →正直ウンザリする →皮肉を込めた(天領倉敷(笑))● ハッシュタグは「#tkscala」 岡山県内の勉強会コミュニティでも異彩を放つTL として一部で悪名高い● 次回は8/20(土)でーす 33/53
  • 34. Scala勉強するのにどうしたらいいのさ 34/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
  • 43. 開発環境とかどんなのがあるのん? 43/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
  • 50. デモる?(時間の許す限り) 50/53
  • 51. あと最後に● 魔法少女Scalaちゃん(@scalachan)を 今すぐフォロー! 51/53
  • 52. あと最後に 一緒にF#やろうぜ! 52/53
  • 53. あと最後に● 間違えた 一緒にScala やろうぜ! 53/53

×