Haskell Day 2019に参加したメモ。
参加モチベーション
普段Haskellは書かないが、Functional Programmingやリッチな型システムを実用している方々の話からアイデアを得るために参加した。
実際、型レベルプログラミングのテクニックは多少Haskell以外(ぼくの場合Go)でも活かせるのではと思えた。
個人的に良かった話
大規模数値計算を支える Haskell ── Pragmatic Haskell in Large-Scale Numerical Computation
(資料はおそらく公開されない)
プラグイン機構を型レベルで表現する話が魅力的だった。
拡張性を高めるため、コアを小さくしプラグインで多くの機能を提供する、というのはJenkins等で見られるパターンだ。 それをプラグインを依存型として表現することで特定のプラグインに対する操作を型レベルで扱えるように定義していた。
操作対象のプラグインに対してパターンマッチがうまくハマる、間違ったプラグインを取り出そうとしてもコンパイルエラーになる、というメリットがありそう(ぼくの理解なので間違ってるかも)。
Goでは標準のプラグイン機構としてplugin
パッケージがあるが、型安全な代物ではない。
関数と型で理解する自動微分
ぼくには理解できないんだろうなーと思っていたが、とてもわかりやすい説明と手順ですっかり引き込まれてしまった。
細かい理屈や気をつけるべき点(そもそも微分可能かとか)はさておき、二重数によってうまいこと自動微分される様は感動的だった。
その二重数を幽霊型(Phantom Type)として表現するのもHaskellの良さが全面に出ていて素晴らしかった。
ぼくが関数をみると微分せずにはいられないタイプではないことがただただ悔やまれる。
その他思ったこと
Goと比較して、Haskellは開発効率やメンテナンス性よりは表現力を重視する言語なんだなと感じた。
(もちろん開発効率やメンテナンス性を軽視してると言いたいわけではない)
多くの発表で言及されていたDerivingVia
は、どの型の実装を採用するかコントロールすることで型ごとの実装の重複を避けつつエレガントに派生関係を表現できる魅力的な拡張だ。
一方で、その型の使用箇所でどの実装が使われるか追うのが大変だったりしないのだろうか、とも考えてしまった。
Higher Kinded Datatypeの話では、HKDを含んだコードはコンパイル時間がそれなりに伸びてしまうという課題があるとのことだった。 詳細はわからないしその点がどのように受け取られているかわからないが、細かくコンパイルしたいぼくみたいな人間としては結構抵抗を感じた。
おそらくぼくがそういった課題に対する解決策や周辺ツールを全然知らないことも大いにありそうなので、ぜひモダンなHaskellの開発スタイルを知りたいなと思った。 (haskell-ide-engine入れるくらいしか知らない)