1

値がa: Free[Op, A]の場合、aの構造を「平坦化」して、フリーモナドによって結合された2つのOpが1つにまとめられる可能性がありますか?フリーモナドを最適化する

コンテキスト:Opという意味はその操作が冪等であるため、これを解釈前に最適化ステップとして実行したいと思います。したがって、2つが「連続して」表示される場合、2つ目はプログラムのセマンティクスに無償で削除できます。

+0

これはインタープリタレベルでのみ行うことができますか?それは有益な一般化のように思えます。 – beefyhalo

+1

基本的な自由制限ではなく、Scalaの熱心な評価戦略に由来するScalaz/cats実装の制約です。理由はスタックオーバーフローを防ぐために 'Free'の' flatMap'によって使用されるGosub/FlatMappedコンストラクタです。計算をトランポリン関数にラップすることでさらにイントロスペクションの進行を不可能にします。 –

答えて

2

フリーモナドプログラムのこの種のイントロスペクションは、それぞれのステップが別のステップの結果に依存するシーケンシャルな計算を表すためのものではありません。

Free MonadとFree Applicative(https://www.youtube.com/watch?v=H28QqxO7Ihc)の賛否両論については、John de Goes氏の大きな話があります。後者はイントロスペクションの力を与える。