Fringeneer's Tech blog

Fringe81の開発者ブログ

Typelevel Summitに参加してきました

こんにちは、@petitvioletです。
遅くなりましたが、ScalaDaysの翌日に開催されたTypelevel Summitにも参加したので、そちらについてのレポートです。

ScalaDaysの参加レポートはこち
fringeneer.hatenablog.com

typelevel.org

Typelevel summit

Typelevel.scalaにまつわるカンファレンスです。
ScalaDaysよりも技術的に難しい話が多かった印象で、そのせいか人数もかなり少なくなっていて70-80人くらい?の比較的小じんまりしたイベントでした。

f:id:fringeneer:20170608230013j:plain

Inviting everyone to the party

基調講演
資料
プログラミングパラダイムはたくさんある。
コミュニティや考え方など、人には色々なコンテキストがあり、それを尊重しよう、という話。

途中、Type Tetrisという単語が出てきてちょっと笑いが起きてました。
やっぱり型合わせでみんな苦労しているんだな、と。

Refined types for validated configurations

資料:Refined Types for Validated Configurations

Configurationはボイラープレートが多い上にバリデーションが難しく、RuntimeExceptionになってしまいがち。
それなのに何かミスがあると致命的な結果に繋がってしまうことが多いため、
ボイラープレートを削除しつつ安全にしたいという欲求が生まれ、
ライブラリを組み合わせて楽に安全にconfigurationする方法について話していました。

pureconfigで設定をちゃんとクラスで表現しつつ、refinedで値に対する制限を表現する、というイメージになりますね。

発表者のViktor氏が開発しているCirisも型安全にconfigurationが出来て便利そうでした。

Herding types with Scala macros

資料:Typelevel summit

AerospikeのScalaクライアントをmacroを使って実装した話でした。
TinkoffCreditSystems/aerospike-scala

shapelessのHListに対して適切な型のBinWrapperをmacroで生成するようになっており、型安全にデータを保存できるようになったそうです。

Monad Stacks

資料:MonadStacks.pdf

PlayでJsonを受け取ってユーザーを作成・保存してユーザー情報をJsonとして返す、という流れを実装するにあたって、
普通に実装するとFutureOptionの扱いもあり、そこそこのコード量になってしまう。

単にFuture[A]だけならfor式を使って簡潔に書けるが、Future[Option[A]]になってしまうと単純にfor式ではうまく書けなくなる。 Error情報を持つクラスをErratumとして定義しつつ、Future[Either[Erratum, A]]をどうやって扱うか、という話。

選択肢は以下を上げていました。

後半はこれらに対応するライブラリの紹介だったので、詳細は資料をご参照下さい。

Freestyle: A framework for purely functional FP Apps & Libs

47degreesのCTO。
frees-io/freestyleについて。

@freeをつけるだけでfree monadになるというイメージなもの。すごい…。 @freeをつけたalgebraと、それのinterpreterを実装するだけで良いというのは非常に楽で良いですね。

PlayやSlickとのintegrationも開発されてました。

stack safeになっており、大量にannotationを付けてもパフォーマンスの劣化も無いとのことです。

Lenses for the masses introducing Goggles

kenbot/goggles: Pleasant, yet principled Scala optics DSL

Monocleを強化してstring interpolatorとして利用できるようにしたものについて。

公式のサンプルから例を拝借すると、以下のようにgetter/setterを実行できる。
なかなか変態チックですね。

get"$myBakery.cakes*.toppings[0].cherries"
set"$myBakery.cakes*.toppings[0].cherries" := 7

setは内部的にはcase classのcopyを呼んでいるが、ネストしたcase classのcopyを意識せずに済む上に、*[0]でループ処理やindex指定できる、さらに?Optionなオペレータを提供していたりと非常に便利。

Mastering Typeclass Induction

資料: Mastering Typeclass Induction

Listを再帰的に型レベルで処理していく手法について。

val x: Named[(Int, (String, (Char, EOL)))] = ???
f(x)
// "int, string, char,"

簡単に言うとこの例のfをどのように実装するか、という話。 数学的な帰納法と型クラスを使って実現していました。

値について再帰的に処理するのではなくて、型そのものに対して再帰的に処理するインタプリター的なものを実装するという観点がなく、非常に新鮮でした。

Do it with (free?) arrows!

資料: Do it with (free?) arrows! (1))

WhatとHowを分離させる宣言的プログラミングの話から始まり、Applicative Functor, Monad, Arrowだとどう実現できるかという話でした。

Monadだと失敗ケースで畳み込んでしまって蓄積できないデメリットがあるが、Applicative Functorだと表現力が足りない。
そこでArrow、さらにChoiceを使うとそのようなニーズを完全に満たすことが出来るそうです。

やや難しいですが、使ってみるだけならそこまで難しくはないかもしれないですね。

感想

ScalaDaysが幅広いScala開発者を対象とした大規模なイベントだったのに対して、Typelevel Summitは関数型プログラミングな開発者に絞ったイベントだったので、人数が少ない分内容も濃くて非常に楽しかったです。
初心者お断りなトークを英語で聞いて理解が非常に怪しいので復習します…。

ちなみにランチタイムはビュッフェ形式で豪華な食事もあり、着席するスタイルでした。
テーブルはこんな感じ。 f:id:fringeneer:20170629105558j:plain

いつか海外カンファレンスでトーク出来るように頑張ります。