Project German-style

同人、Github、その他活動の記録と報告

machinecell-3.0.0リリース

「なんか告知に使えるかも」と思って残しておいたブログだけど、 よく見たらmachinecellとか暗黒定数式とか勉強会とかの告知すらしてないな。

これまでのあらすじ

Haskellのストリーミングライブラリmachinecellの過去の紹介記事は、qiitaの方にあります。

しかし例のコードが古いので、githubのサンプルでも見て頂ければ。

qiita.com

qiita.com

要約すると「conduit/pipes/machines系のライブラリだけど、アロー記法が使えるよ、なのでFRPっぽいのもいけるよ!」というライブラリだと思って頂ければ間違いないです。

3.0.0の変更点

という訳で、このブログでは初エントリですが3.0.0です。

machinecell: Arrow based stream transducers | Hackage

3.0.0ではAPIに大きな変更点はない(むしろ減ってる)のですが、内部構造をブラッシュアップした結果として「ProcessAのloopがベースのloopに依存しなくなった」という大きな改善があります。

loopというのはArrowLoopのインスタンス関数で、Monadで言うところのMonadFixのmfixに相当します。

2.Xのloopはベースのloopに依存しているので、loopの動きに影響されやすい、という問題がありました。たとえば基底がKleisli IOの場合にループと副作用を混ぜると、未来の値を参照している訳ではないにもかかわらず、indefinite MVar access例外が発生してしまいます。そのためこのexampleでは、108行目のrecステートメントにおいて、副作用のあるWxC.bindをループの外に隔離しています。

3.0.0では、基底のloopを呼ばなくなっているので、普通にrecステートメントの中に全部書いてしまってOKです。

これにより、loopを純粋に「フィードバックループ、ないしは局所状態の定義」という目的に使う事ができるようになっています。