Scalaで萌える関数型プログラミング[完全版]
Upcoming SlideShare
Loading in...5
×
 

Scalaで萌える関数型プログラミング[完全版]

on

  • 10,604 views

 

Statistics

Views

Total Views
10,604
Views on SlideShare
10,387
Embed Views
217

Actions

Likes
20
Downloads
69
Comments
0

6 Embeds 217

http://d.hatena.ne.jp 190
http://twitter.com 11
http://paper.li 6
http://s.deeeki.com 5
http://a0.twimg.com 3
https://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Scalaで萌える関数型プログラミング[完全版] Scalaで萌える関数型プログラミング[完全版] Presentation Transcript

    • 闇JVMKaigi Scalaで萌える関数型プログラミング [完全版] 1/52
    • 前回までのあらすじ● 7/9(土)のOITECでScalaについてのLTを やったのであった!● 時間全然足りなかったしちゃんとしたことが 伝えきれなかった! (SlideShareにあげたら何人かにRTされた。 くだらん内容でサーセン● 今回は時間に余裕があるのでもう少し 掘り下げてお話をしようと思ったのである!● OITECで実践F#をもらったのでちょっと なびいたのはここだけの秘密だ! 2/52
    • 今から話す人の ざっくりとした説明● 角田裕樹(すみだゆうき)● Hatena / id:razon● Twitter / @razon● ×ラゾン ○レゾン ◎しゾン● 天領倉敷Scalaの言いだしっぺ● 本業はJavaプログラマ その時々で他のことも結構やってるけど… 3/52
    • これからお話しすること● Scalaってなんぞ● 関数型プログラミングってなんぞ● 天領倉敷Scalaって何?● Scala勉強するのにどうすればいいのさ● 開発環境とかどんなのがあるのん?● 時間が余ったらライブコーディングとか? 4/52
    • Scalaってなんぞ? 5/52
    • Scalaってなんぞ?● スイス連邦工科大学(EPFL)のMartin Odersky が設計したプログラム言語● JVM上で動作する (コンパイルするとJavaのバイトコードになる) ※更新は止まっているが.NET向け実装 (scala-msil)もあり →何か開発進めるためにMSがお金を落としている という怪情報がTwitter上に流れてた…● オブジェクト指向と関数型のハイブリッド 6/52
    • Scalaってなんぞ?● JVM上で動くと何が嬉しいのん? →Javaとの相互利用が可能 →Javaの資源(ライブラリ・FW・ミドル) がそのまま利用可能 ・JDBCドライバ ・Servlet/JavaEEコンテナ ・などなど… 7/52
    • Scalaってなんぞ?● ちゃんとした所で使われてんの? →使われてます! 8/52
    • Scalaってなんぞ?● ちゃんとした所で使われてんの? →使われてます! 9/52
    • 関数型プログラミング ってなんぞ? 10/52
    • 関数型プログラミングってなんぞ?● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系● ご先祖様はLISP● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる 11/52
    • 関数型プログラミングってなんぞ?● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系● ご先祖様はLISP● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる● =高階関数! 12/52
    • 関数型プログラミングってなんぞ?● で、何がうれしいのん?● 関数型言語といえば、コレクションの操作!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/52
    • 関数型プログラミングってなんぞ?● 入力に対し、関数をチェーンすることで 出力形式に変換していくscala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)res4: Int = 12 14/52
    • 関数型プログラミングってなんぞ?● 入力に対し、関数をチェーンすることで 出力形式に変換していくscala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)res4: Int = 12● 手続き型っぽい処理と比べると…var sum = 0for (i <- list) { if (i % 2 == 0) { sum += i * 2 }} 15/52
    • 関数型プログラミングってなんぞ?● 入力に対し、関数をチェーンすることで 出力形式に変換していくscala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)res4: Int = 12 抽出 変換 集計● 手続き型っぽい処理と比べると…var sum = 0for (i <- list) { if (i % 2 == 0) { sum += i * 2 }} 抽出 集計 変換 16/52
    • 関数型プログラミングってなんぞ?● イミュータブル! →作成後にその状態を変えることができない 17/52
    • 関数型プログラミングってなんぞ?● イミュータブル! →作成後にその状態を変えることができない● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因 18/52
    • 関数型プログラミングってなんぞ?● イミュータブル! →作成後にその状態を変えることができない● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因● 関数型らしいコードを書くことで、 変化する状態を最小限にすることができる (純粋関数型言語のHaskellなどは変数に再代入不可) 19/52
    • 関数型プログラミングってなんぞ?● イミュータブルの副次的な恩恵● テストがらくちんになる (状態を考慮したテストをする必要が なくなる) 20/52
    • 関数型プログラミングってなんぞ?● イミュータブルの副次的な恩恵● テストがらくちんになる (状態を考慮したテストをする必要が なくなる)● 並列処理がらくちんになる 状態を持たなければ、スレッドの同期や ロックなどを考慮する必要がなくなる →Scalaでは状態を持つ場合でも比較的簡単に並列処理を 行うためのActorライブラリというものもあります 21/52
    • 関数型プログラミングってなんぞ?● カリー化と部分適用● カリー化!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/52
    • 関数型プログラミングってなんぞ?● カリー化と部分適用● カリー化!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/52
    • 関数型プログラミングってなんぞ?● 部分適用した関数を使ってみる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/52
    • 関数型プログラミングってなんぞ?● 部分適用した関数を使ってみる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/52
    • 関数型プログラミングってなんぞ?● 遅延評価● 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/52
    • 関数型プログラミングってなんぞ?● 遅延評価● 名前渡し引数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/52
    • 関数型プログラミングってなんぞ?● 遅延評価● 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/52
    • 関数型プログラミングってなんぞ?● パターンマッチ!● 型別に振り分けてみる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/52
    • 関数型プログラミングってなんぞ?● パターンマッチ!● 定番の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/52
    • 関数型プログラミングってなんぞ?● パターンマッチ!● 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/52
    • 天領倉敷Scala って何? 32/52
    • 天領倉敷Scalaって何?● 岡山県倉敷市周辺でScalaの勉強会を行う コミュニティ● 「天領」…江戸時代における幕府の直轄領 倉敷市民がことあるごとに持ち上げる単語 →正直ウンザリする →皮肉を込めた(天領倉敷(笑))● ハッシュタグは「#tkscala」 岡山県内の勉強会コミュニティでも異彩を放つTL として一部で悪名高い● 次回は8/20(土)でーす 33/52
    • Scala勉強するのにどうしたらいいのさ 34/52
    • Scala勉強するのに どうしたらいいのさ 書籍● Scalaスケーラブルプログラミング [コンセプト&コーディング]● 通称コップ本● 聖典(Oderskyの著書)● キッチリ書いてある分難しい● あと高い(5k近くする)● が、買う価値はあり 35/52
    • Scala勉強するのに どうしたらいいのさ 書籍● Scalaプログラミング入門● Lift Frameworkの中の人 David Pollakの著書● 天領倉敷Scalaではこの本を ベースに学習しています● コップ本よりは読みやすい 36/52
    • Scala勉強するのに どうしたらいいのさ 書籍● プログラミングScala● 通称バク本● Twitter APIのリードプログラマーが 書いてる● 二冊目の本としてオススメの声多し 37/52
    • Scala勉強するのに どうしたらいいのさ 書籍● Scala実践プログラミング● 日本のScala界の巨匠が結集して 書かれた本● 新しい(先月出ました)● 和書なので読みやすい● 初心者向けはコレが鉄板かと● 上級者からは「物足りない」の声あり● ただし、他の本で触れられていない部分 についての解説あり (デザパタ・限定継続など…) 38/52
    • Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア● @kmizu Scalaエバンジェリストといえばこの人 ScalaDaysという世界のScala祭りで発表されてます! Scalaとか静的型付け vs 動的型付けなどの議論をMatzと繰 り広げる猛者● @yuroyoro 日本Scala界のスーパースター 最近ではほむほむ言語の中の人として脚光を浴びる 新作言語ウキャスがマジ宇宙語 39/52
    • Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア● @xuwei_k Scalaについてのエントリをブログで精力的に書いてる人 (OITEC版の資料でツッコミ頂きましたthx!) RubyKaigiでMatzに「Scalaの人ですね」的なことを言われ たとか● @keisuke_n 日本のScala祭り「Scala座」第一回主催 WebFlavorというScalaフレームワークの作者でもある 大都会岡山クラスタ 天領倉敷Scalaにも何度か来ていただきました 40/52
    • 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/52
    • 開発環境とかどんなのがあるのん? 42/52
    • 開発環境とか どんなのがあるのん? エディタ編● 実はデフォルトで色んなエディタ/IDE用の拡張がついてる geditとかtextmateとかxcodeとか… 43/52
    • 開発環境とか どんなのがあるのん? エディタ編● 実はデフォルトで色んなエディタ/IDE用の拡張がついてる geditとかtextmateとかxcodeとか…● とはいえ、vim or emacs ですよね! →エディタ宗教戦争だー!● vim codefellowとかneocmplecacheで補完が効いたりするらし いですよ(emacs派なのでわかりませんサーセン←)● emacs ENSIMEというのがありますよ奥さん 補完とかリファクタリングとか効いて結構強力 44/52
    • 開発環境とか どんなのがあるのん? IDE編● 以前はIDEサポートが実に残念であった…● 今では割と大丈夫なクオリティになったとか● IntelliJ IDEA 昔はこれくらいしかまともに使えるIDEがなかった →結果、今でも使ってる人が多い(気がする) sbt(後述)consoleがあるのもステキ 但し、無料版はAPサーバとの統合が無いので注意 45/52
    • 開発環境とか どんなのがあるのん? IDE編● Eclipse● NetBeans Java開発に於いては定番ですね 特にEclipseは昔はひっじょーーーーーに残念なクオリティ をしていましたが、今では結構大丈夫みたいです! (最近はちょろっとしか触ってないから良くわry) 46/52
    • 開発環境とか どんなのがあるのん? IDE編● Eclipse● NetBeans Java開発に於いては定番ですね 特にEclipseは昔はひっじょーーーーーに残念なクオリティ をしていましたが、今では結構大丈夫みたいです! (最近はちょろっとしか触ってないから良くわry)● という訳で、趣味で(というか、自分の手に 馴染むモノを)選んでいいかも? 47/52
    • 開発環境とか どんなのがあるのん? ビルドツール編● sbt(simple-build-tool)● Scalaのビルドツールはこれが鉄板● 一部では「酢豚」とか「サバト」の愛称で親しまれる● mavenのpom.xmlをScalaで書く感じだと言ったら 乱暴だろうか… (sbtのディレクトリ構成はmaven準拠で、連携可能)● Javaもビルドできる● ファイルの更新を検出して自動的にコンパイルしたり テストコード走らせたりとか 48/52
    • デモる?(時間の許す限り) 49/52
    • あと最後に● 魔法少女Scalaちゃん(@scalachan)を 今すぐフォロー! 50/52
    • あと最後に 一緒にF#やろうぜ! 51/52
    • あと最後に● 間違えた 一緒にScala やろうぜ! 52/52