Submit Search
Scalaノススメ
•
27 likes
•
15,766 views
Yasuyuki Maeda
Follow
静的型付けの関数型言語のすばらしさに加えて、HaskellやOcamlにはないScala独特の機能について紹介した資料です。
Read less
Read more
1 of 41
Download now
Downloaded 36 times
More Related Content
Scalaノススメ
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はすばらしい⾔言語です。 ¤ そのすばらしさを完全に享受するのは⼤大変ですが、 その苦労以上の価値があります ¤
とりあえず、できるところから始めてみましょう。
Download