Typelevel Summitに参加してきました
こんにちは、@petitvioletです。
遅くなりましたが、ScalaDaysの翌日に開催されたTypelevel Summitにも参加したので、そちらについてのレポートです。
ScalaDaysの参加レポートはこちら
fringeneer.hatenablog.com
Typelevel summit
Typelevel.scalaにまつわるカンファレンスです。
ScalaDaysよりも技術的に難しい話が多かった印象で、そのせいか人数もかなり少なくなっていて70-80人くらい?の比較的小じんまりしたイベントでした。
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
AerospikeのScalaクライアントをmacroを使って実装した話でした。
TinkoffCreditSystems/aerospike-scala
shapelessのHListに対して適切な型のBinWrapper
をmacroで生成するようになっており、型安全にデータを保存できるようになったそうです。
Monad Stacks
PlayでJsonを受け取ってユーザーを作成・保存してユーザー情報をJsonとして返す、という流れを実装するにあたって、
普通に実装するとFuture
やOption
の扱いもあり、そこそこのコード量になってしまう。
単に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は関数型プログラミングな開発者に絞ったイベントだったので、人数が少ない分内容も濃くて非常に楽しかったです。
初心者お断りなトークを英語で聞いて理解が非常に怪しいので復習します…。
ちなみにランチタイムはビュッフェ形式で豪華な食事もあり、着席するスタイルでした。
テーブルはこんな感じ。
いつか海外カンファレンスでトーク出来るように頑張ります。