Freeモナド
Freeモナドとは、Functorをパラメータとしてモナドにする構造である。
code:haskell
data Free f a = Pure a | Free (f (Free f a))
2012年秋、日本のHaskellコミュニティにおいてFreeモナドが熱狂的な流行を見せた。
Extensible effects、襲来
Reflection without remorse 〜慈悲なき反省〜
従来のFreeモナドは、>>=が左結合になっていると二乗オーダーで遅くなるという欠点を抱えていた。かと言ってCPS変換すると、ステップ単位での実行ができない。それに対するソリューションとして2014年、Reflection without remorseというアプローチが生まれた。これは、継続の列を結合可能キューに格納することによって、その弱点を克服するというものだ。しかし、そのキューは極めてオーバーヘッドが大きく、通常のFreeモナドの方が早いという始末だ。そもそも、一ステップずつ実行しながらその継続を動的に組み合わせたいという場面はほとんどなく、CPS版Freeから通常版のFreeを鋳造すれば済む。conduitやmachinesはそのような考えのもとに実装されている。 温故知新のfreer
FreeモナドとExtensible effects、Open unionsの関係を示唆するFreer Monads, More Extensible Effectsという論文が2015 年に発表された。この論文の貢献は、実装が難しくてしかも遅いChris OkasakiのCatenable Dequeではなく、単なる二分木を使うことによってパフォーマンスを改善したことにある。それでも2〜3個程度のスタックならモナド変換子の方が速い。 また、Extensible effectsが抱えていた、Typeableを要求するために多相型が使えなかったり、型推論がうまく行かないという問題は解決されていない。
extensibleの進撃
extensibleは拡張可能レコードとバリアントを扱うためのライブラリだ。開発者のfumievalのやる気が出たため、急遽Extensible effectsの機能が追加された。しかしやる気が足りなかったのか、まとも解説記事は2017年になるまで執筆されなかった。 freerで提唱された二分木を独自に改良しただけでなく、キーと値を分けて扱うextensibleのメカニズムを応用して多相型も扱えるようになり、実用性が大幅に向上した。freerの倍の速度が出るが、それでもモナド変換子には勝てなかった。
ReaderTパターンを応用した異色のライブラリ。もはやFreeモナドではないため別の記事へ。