Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Scalaノススメ

18,258 views

Published on

静的型付けの関数型言語のすばらしさに加えて、HaskellやOcamlにはないScala独特の機能について紹介した資料です。

Published in: Technology
  • Traitのすばらしさはこちらに書きました。 「Javascript as an Embedded DSL – ScalaにおけるExpression Problem の解法 -」
    http://www.slideshare.net/maedaunderscore/scala-javascript-as-an-embedded-dsl-scalaexpression-problem
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • こちらこそ、ご指摘ありがとうございました。共変は話が複雑になるので省略しています。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 修正ありがとうございます。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 細かいことですが、無粋なツッコミを。

    14ページ目

    case object None extends Option[Null]

    ではなく

    case object None extends Option[Nothing]

    ですね。あと、共変とか

    https://github.com/scala/scala/blob/v2.9.2/src/library/scala/Option.scala#L272
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Scalaノススメ

  1. 1. Scalaのすゝめ 2012.9.25 前⽥田康⾏行行 (@maeda_) 株式会社Phantom Type設⽴立立記念念
  2. 2. ⾃自⼰己紹介 ¤  前⽥田康⾏行行 (@maeda_) ¤  名古屋在住のフリーランス(http://www.illi-ichi.com) ¤  好きな⾔言語 ¤  Scala ¤  Smalltalk ¤  DyNagoya ¤  Dynamic Language + Nagoya ¤  http://dynagoya.info/
  3. 3. アジェンダ ¤  静的型付け関数型プログラミングのすばらしさ ¤  Scalaのすばらしさ ¤  Scalaを始める
  4. 4. 静的型付け関数型プログラミングの すばらしさ
  5. 5. 関数型 と⾔言っても、何かよく分かりませんが、 ⼀一番根底にあるのは「式指向」 と考えています。
  6. 6. 式指向(Expression Oriented) ¤  式とは ¤  値は式 ¤  関数の引数に式を渡して評価すると値になる  →  式 ¤  式指向とは ¤  式を組み合わせてプログラムを作る ¤  ⼿手続き型は⽂文を順次実⾏行行する
  7. 7. 式指向(具体例例) ¤  ⼿手続き型の場合 ¤  式指向の場合
  8. 8. 式指向(具体例例) ¤  式指向の場合 式 式 式 式 式 式 式
  9. 9. もうひとつ具体例例 ¤  式指向でWeb Serverを考える ¤  Web Server は HTTPリクエストをHTTPレスポンスに変換する 関数 ¤  関数の組み合わせ(値の変換)で、プログラムを記述する リクエスト  →  タスク  →  結果  → レスポンス
  10. 10. 「レガシーコード改善ガイド」から抜粋 ¤  例例えば、無駄に⻑⾧長い⼿手続き型のメソッドにはseamがない ¤  式指向ならば、いろんな場所がseamになる! ¤  ⾃自然にテスタビリティ・再利利⽤用性・拡張性の優れたプログラ ムになる 接合部 接合部  (seam)とは、その場所を直接編集しなくても、プログラ ムの振る舞いを変えることのできる場所である  。 P.36 より
  11. 11. さらに型をつけると・・・ ¤  型チェックされるのは、関数の引数と戻り値に対してのみ ¤  ⼿手続き型における⽂文の羅羅列列は型チェックがない ¤  式指向なら、何がそこに書けるかは型によって決まる ¤  あらゆる場所で整合性のチェックがされる ¤  コンパイルが通った時の安⼼心感が違う
  12. 12. 型を作る ¤  例例えば、タスクは以下のものがあるとして ¤  ユーザーの登録(パラメータ:ユーザー名・年年齢) ¤  ユーザーの更更新(パラメータ:ユーザー名・年年齢) ¤  ユーザー⼀一覧の取得(パラメータなし) ¤  代数データ型(Scalaならcase class)で簡単に型が作れる ¤  残念念すぎるコードの例例 ¤  flagの値の範囲や使ってはいけない変数など、規約ができている ¤  規約を守るようにプログラマが気をつける
  13. 13. 型を分解する ¤  型はパターンマッチで分解 ¤  型によって、取り出せるものが限定される ¤  ケースの網羅羅性のチェックも可能 ¤  例例:case ShowAllUsers => ...の⾏行行がないとワーニングが出る
  14. 14. もっと型を! ¤  できるかぎり情報は型に持たせたい ¤  例例:変数の値があるか、ないか       値レベルで → 値がない場合は変数にnullを代⼊入     型レベルで → Option[T]型を使う
  15. 15. Option[T]型を使う ¤  nullを返す場合(Option型を使わない場合) ¤  nullが返ることがあるという規約ができてしまっている ¤  nullチェックを忘れたら、実⾏行行時にヌルポ
  16. 16. Option[T]型を使う ¤  Option[T]を使う場合 ¤  値がないかもしれないことは型をみれば分かる ¤  ヌルポはありえない!(型が合わずにコンパイルエラーになる)
  17. 17. Option[T]型を使う ¤  Option[T]を使う場合(パターンマッチを使わない) ¤  Option型には便便利利なメソッドがいろいろある
  18. 18. 型はドキュメント ¤  ⾃自然⾔言語では抽象的な概念念を表すことが難しい ¤  抽象的な概念念は⼈人間にはあいまいになりがち ¤  コンピュータはあいまいでは動かない ¤  型は形式的な記述。⽭矛盾はコンパイルエラー ¤  型があれば、安⼼心して抽象的な概念念を扱える
  19. 19. 型はドキュメント(具体例例) ¤  お題  下記の関数を書け 引数: ・キーのコレクション ・キーに対応する値に変換する関数 ※ただし、キーに対応する値は⾼高々1つ 戻り値: 渡されたキーに対応する値のコレクション ¤  型を書かないで、変数名でがんばってみる ¤  型があれば、変数名は適当でも分かる
  20. 20. 静的型付け関数型⾔言語  まとめ ¤  ここまでは静的型付け関数型の共通の話 (もちろん、⽂文法は異異なります。) ¤  基本パーツは、これだけ ¤  式 ¤  型 ¤  パターンマッチ ¤  柔軟 + 明瞭 + 型安全
  21. 21. Scalaのすばらしさ
  22. 22. Scala ¤  静的型付け関数型 ¤  代数データ型/パターンマッチ ¤  型推論論 ¤  オブジェクト指向 ¤  前衛的な機能 ¤  暗黙のパラメータ / 暗黙の型変換  など ¤  JVM上で動く ¤  コンパイルするとclassファイルができる ¤  ScalaからJavaのclassを使うことも、その逆も可能
  23. 23. 充実のコレクション - immutableとmutable - ¤  immutable(不不変) ¤  List ¤  Map ¤  Set ¤  mutable(変更更可能) ¤  ArrayBuffer ¤  ListBuffer ¤  Map ¤  Set
  24. 24. 充実のコレクション - 便便利利メソッドもいっぱい - ¤  お題 ¤  コレクションxsの中の2要素の組み合わせ全て列列挙せよ ¤  前のページのどのコレクションでもcombinationsメソッドが 実装されている ¤  コレクションの種別ごとに実装していたら、メンテナンスが ⼤大変
  25. 25. 充実のコレクション - そこで継承ですよ - ¤  combinationsメソッドの実装は⼀一カ所のみ。他のメソッドも 重複する実装は最⼩小限にとどまっている ¤  コレクションの親クラスで実装されているため、⼦子クラスご とに個別に実装する必要はない ¤  特定コレクションについて、適切切なアルゴリズムがある場合 は、オーバーライドして、個別に最適な実装をしている ¤  Traitにより、モジュールの分割や組み合わせが容易易にできる ため、きめ細やかな階層構造が作れる
  26. 26. 充実のコレクション - (いい意味で)やばい多相性 - ¤  異異なる種類のコレクションの結合(++メソッド)が可能 ¤  しかも、型が維持される(アップキャストされない) ¤  Option型も要素数が0か1のコレクションとして扱える。
  27. 27. 充実のコレクション - この多相性はOOだけでは無理理 - ¤  コレクションまわりの多相性は、暗黙のパラメータ(implicit parameter)も活⽤用している ¤  Haskellの型クラスに対応する ¤  ⾒見見えないところで、型によってそれっぽい組み⽴立立て⽅方を選ぶ
  28. 28. 省省略略について - Scalaの省省略略っぷりはすごい - ¤  Scalaは省省略略のテクニックがいっぱいある ¤  暗黙のパラメータ/暗黙の型変換 ¤  型推論論 ¤  import ¤  その他、シンタックスシュガーなど
  29. 29. 省省略略について - やりすぎ注意 - ¤  省省略略しすぎると、逆に分からなくなる ¤  でも、コンテキストによって「⾔言わずもがな」は省省略略したい ¤  省省略略するには、 ¤  コンテキストが明確であることが⼤大事 ¤  そのコンテキストが有効なスコープが分かりやすいことが⼤大事 ¤  スコープのコントロールしやすいことが⼤大事 ¤  暗黙のパラメータ/暗黙の型変換はスコープの中から使える ものを探す。これらの機能は特に強⼒力力なので、よりスコープ の扱いが重要となる
  30. 30. 省省略略について - ⾔言わずもがなの例例 - ¤  Nodeクラスってなんだ? ¤  このクラスでは「⾔言わずもがな」 ¤  importしたから「⾔言わずもがな」
  31. 31. importがすばらしい ¤  importで名前空間の省省略略が可能 ¤  Scalaのimportはどこにでも書ける ¤  importがスコープを持っている (ファイル全体/クラス内/関数内/ブロック内)
  32. 32. さらにimportがすばらしい ¤  オブジェクトをimportできる ¤  コンテキストを外部から注⼊入する例例 ¤  モジュールとしてのオブジェクトを使う ¤  お⼿手軽 & 強⼒力力 ¤  オブジェクトの⽴立立ち位置がJavaとは異異なる ¤  さらに、ScalaにはTraitがあって・・・ ¤  Traitのすばらしさはこちら参照 「Javascript as an Embedded DSL – ScalaにおけるExpression Problem の解法 -」 http://www.slideshare.net/maedaunderscore/scala-javascript- as-an-embedded-dsl-scalaexpression-problem
  33. 33. Scalaについてまとめ ¤  関数型 + (クラスベースの)オブジェクト指向の世界 ¤  複雑。。。 ¤  頑張るのはライブラリ実装者 ¤  使う側は簡単(なことが多い) ¤  話してないけど、ScalaのTraitはすごい
  34. 34. Scalaを始める
  35. 35. Scalaの学びやすさ   = プログラミングの始めやすさ ¤  書いてみないと、使えるようにはならない ¤  Javaっぽくも書けるし、とりあえず始めれる ¤  JVMが動けば、どこでも動く ¤  Linux / Mac / Windows ¤  Google App Engine / CloudBees / Heroku ¤  Android
  36. 36. ライブラリも充実 ¤  標準ライブラリ ¤  豊富なコレクション ¤  XML ¤  Actor ¤  Parser Combinator ¤  ツール ¤  sbt ¤  各種IDEのプラグイン ¤  オープンソースライブラリ ¤  Dispatch ¤  Scalaz ¤  shapeless ¤  Webフレームワーク ¤  Lift ¤  Play! ¤  Unfiltered ¤  Scalatra ¤  spray ¤  blueeyes ¤  finagle ¤  分散フレームワーク ¤  akka ¤  Scalaのライブラリがなくても、Javaのライブラリも使える
  37. 37. Scalaの企業での導⼊入実績 ¤  Scalaは企業での導⼊入実績も多数あります ¤  Twitter ¤  FourSquare ¤  LinkedIn ¤  Tumblr ¤  Électricité de France Trading ¤  Novell ¤  Sony ¤  などなど... http://www.scala-lang.org/node/1658  より抜粋
  38. 38. 初⼼心者がScalaを学ぶ上での問題 - Scalaの開発が活発すぎる - ¤  もちろん、いいことだし、これからもそうあってほしい ¤  下記の点は注意 ¤  ⾔言語仕様も発展途上(すでに実⽤用レベルだけど、進化は続く) ¤  標準ライブラリも新しいものがどんどん出てくる ¤  その他のライブラリ・フレームワークもどんどん変わる ¤  標準のビルドツールsbtもどんどん変わる ¤  マイナーバージョン変わったら、ビルドできなくなったとか当た り前(最近、落落ち着いてきた気がする) ¤  プラグインが最新バージョンに追従してないとか当たり前 ¤  ドキュメントはない ¤  ドキュメントがあっても、チュートリアル/ファーストステップ 程度度 ¤  ドキュメントはあっという間に陳腐化 ¤  ソースコードを読め ¤  テストコードを読め
  39. 39. 初⼼心者がScalaを学ぶ上での問題 - 機能が多すぎる - ¤  関数型プログラミングを学ぶ上では、理理解の⾜足枷になるかも ¤  HaskellやOcamlなどで概念念を学んで、Scalaで書くのがオススメ ¤  機能が多ければ、不不具合の可能性も⾼高くなる
  40. 40. 勉強会に⾏行行こう ¤  分かっていれば、簡単なことでも、⾃自⼒力力で調べることが難しいこ とは、いっぱいある ¤  いわゆる関数脳の感覚的なところは本などからは習得しにくい ¤  分かっている⼈人に聞くのが⼀一番の早道 ¤  名古屋の関数型勉強会 ¤  なごやかScala 毎⽉月第1⾦金金曜⽇日 ¤  SML#読書会  毎⽉月第2⼟土曜⽇日 ¤  TAPL-nagoya 毎⽉月第3⼟土曜⽇日 ¤  ProofCafe 毎⽉月第4⼟土曜⽇日 ¤  その他、随時
  41. 41. 結び ¤  Scalaはすばらしい⾔言語です。 ¤  そのすばらしさを完全に享受するのは⼤大変ですが、 その苦労以上の価値があります ¤  とりあえず、できるところから始めてみましょう。

×