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

More Related Content

Scalaノススメ