サンフランシスコで開催されているScala Days 2015に参加しています。
会場は海辺のフォートメイソンセンターというところなのですが、サンフランシスコといっても観光地からは若干離れている上に周囲は住宅街というなかなかシュールなロケーションです。
今日は初日ということで夕方から小田好先生のキーノートセッションのみが行われました。スライドがすでにSlideshareに公開されています。
www.slideshare.net
「Scala - where it came from, where it's going」というタイトルの通り、Scalaのこれまでの振り返りと今後の展望を語るというものでした。昨年日本で開催されたScalaMatsuriで話していた内容やすでに提示されているロードマップとも被りますが、冒頭の"Scala is a gateway drug to Haskell"、そしてHascalatorに名前を変えよう!というジョークで掴みはOKです。
現在のScalaの課題として
- バイナリ互換性
- プラットフォームを選べない
という二点を挙げており、これを解決するためにScalaのソースコードからTASTYという中間ファイルを生成し、そこから各プラットフォーム向けのコード(Javaであればクラスファイル、JavaScriptであればminimizeされたソースコード)を出力するという形にコンパイル方法を変更するとのこと。それにしてもScala.js推しが凄いのですが、大丈夫なのでしょうか…。
また、言語としては以下のようにシンタックスの整理を行うようです。現在のScalaの言語仕様のいけてない部分を修正しようということですね。
- XMLリテラルをString Interpolationにする
- Procedure Syntaxの廃止
- Early Initializerの代わりにtraitがコンストラクタでパラメータを受け取れるようにする
- Existential TypesやHigher-Kinded Typesをよりシンプルに記述できるようにする
新しい機能としてはUnion Types(T&U)やIntersection Types(T|U)が導入されるようです。特にIntersection TypesはScalaでやろうとすると割と無理げな感じの方法しかなかったので嬉しいところです。この新コンパイラは6月に開催されるScala Days Amsterdamまでにアルファリリースされるそうです。
最後に検討項目としてimplicit function typesというものが挙げられていました。
// implicit function type type Transactional[R] = implicit Transaction => R // このコードが下のように展開される def f: Transactional[R] = body ↓ def f: Transactional[R] = (implicit Transaction) => R = body
この機能を応用して、たとえば以下のようなimplicit function typesを定義しておくと、従来通りのthrows句を記述するだけで、型クラスを使用した処理に置き換えることができます。
// implicit function type type throws[R, Exc] = implicit CanThrow[Exc] => R // このコードが以下のように展開される def f: R throws Exc = body ↓ def f: (implicit CanThrow[Exc]) => R = body
これはIOや例外といった副作用を伴う処理をモナドではなく、よりScalaらしい方法で実現するためのアイデアとのことです。確かに見た目の記述はシンプルに見えるのですが、シンタックスシュガーを駆使する記法になるためビギナーは意味もわからず書く、という状態になってしまうかもしれません。CanBuildFromみたいに意識しなくても便利に使えるという割り切りでいいのかもしれませんが…。
ともあれ、オブジェクト指向と関数型の融合と、強力な静的型付けというScalaの特徴を活かしつつ、よりシンプルで直感的な記述が可能な方向に進化していくようです。