Overview of Scala ~Scalaひとめぐり~
2015年9月26日Hacker Tackle
id:daiksy
本日の内容
• Scalaの周辺状況
• 採用事例(海外・国内)
• はてなインターンの様子
• Scalaの特徴
粕谷 大輔 id:daiksy (@daiksy) 株式会社 はてな
• スイス連邦工科大学 (EPFL)のMartin
Odersky(小田好)教授によって設計
• JVMで動作(古の時代は .net Frameworkでも動いた)
• オブジェクト指向と関数型言語のパラダイム
daiksyのScala歴
• 2011年 くらいからちょっと触りだす
• 2012年 ~ 2014年 フリュー株式会社
• 2015年 ~ 現在 株式会社 はてな
日本でも規模の大きな カンファレンス• 2013年 Scala Conference in Japan
• 2014年 ScalaMatsuri 2014
• 2015年 Scala関西Summit
採用事例 (海外)
• Twitter 「Scalaで日本のバルスに耐えた」
(ScalaMatsuri2014にて)
• Linkedin
• Netflix (はてな京都でミートアップ開催)
採用事例 (国内)
• ドワンゴ
• サイバーエージェント
• スマートニュース
• TIS (Typesafeとパートナー契約)
• LINE
• ヌーラボ
• はてな
Scala != Better Java LLからの移行事例が増加
• チャットワーク PHP -> Scala
• はてなブックマーク Perl -> Scala
利用できる主なフレームワーク
• Lift
• Play Framework
• Scalatra
• Skinny Framework
はてなサマーインターン 2015
今年からScalaコースを新設
はてなサマーインターン Scalaコースのカリキュラム• 1日目 Scalaの言語基礎 & 課題(講師 id:daiksy)
• 2日目 DB講義 & 課題(講師 id:mechairoi)
• 3日目 HTTP, WAF講義 & 課題(講師 id:Songmu)
• 最後の3週間 Mackerelチームでプロダクト開発
他にもJavaScriptやインフラの講義も
Scalaの特徴
• JVM上で動作
• 静的な型付けと型推論
• オブジェクト指向
• 関数プログラミング
多態性 (オブジェクト指向)
• trait を使って実現
• trait は複数mixinできる
• trait に実装することもできる
関数プログラミング
• 関数が第一級オブジェクト
• 副作用を伴わない実装のための機能 • if 式 • for 式 • 抱負なコレクションメソッド
副作用とは
• 変数の値を変更する
• オブジェクトのフィールドを変更する(JavaのsetterとかC# のプロパティとか)
• ファイルやデータベースなどに対する入出力
副作用のない宣言(immutable)
副作用のない宣言(immutable)
• var で宣言すると再代入できる
• val で宣言すると再代入できない
• Scalaはコードスタイルや状況に応じてmutable
とimmutableを使い分けられる
• いわゆる「非純粋関数型言語」
コレクション
• List/Array/Map/Set いろいろある
• コレクションには便利なメソッドが山程ある • map/filter/flatMap/find/findAll/reduce • take/drop/exists/sort/sortBy/zip/partition • grouped/groupBy
副作用のない実装まとめ
• val で宣言することで変数が再代入できなくなる
• if式 for式 コレクション操作 などを駆使すると、val だけでプログラミングできるようになる
• 慣れるとvar を使わざるを得ない局面で悔しみを感じる
Scalaではnullも使わない
• 言語仕様的にはnullは存在する
• Scalaではnullを使わずOption型を使う
Option型
• あるかないかわからない値を表現できる型
• Someの中身を使うには明示的に取り出す操作が必要 (ぬるぽに悩まずにすむ)
Option型
• 値があるときはSomeでくるむ
• 値がないときはNone
Option型
• Optionは型なので、そのまま使おうとするとコンパイルで怒られる
Option型のいろいろな 取り出し方
Option型
• 要素が0または1のコレクションとみなせる
• flatMap, foreachなどのコレクションのメソッドを持っている
今日ご紹介しきれない いろいろな機能• case class
• 強力なパターンマッチ
• 暗黙の変換 (implicit)
Scalaは難しい?
• 言語仕様が多いので学習コストは低くない
• 表現力が抱負なので、Better Javaとして書いてもよい (最初はvar使ってもいいのでは)
• 関数プログラミングが難しい? -> 新しいパラダイムの学習は難しい。オブジェクト指向もそれは一緒