Your SlideShare is downloading. ×
Scalaノススメ
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ノススメ

10,014
views

Published on

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

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

Published in: Technology

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

×