問題タブ [monadfix]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Monad のインスタンスはありますが、MonadFix のインスタンスはありませんか?
質問は主にタイトルにあります。mfix
発散する可能性がありますが、どのモナド計算でも定義できるようです。
この構造の何が問題なのですか?また、 と の型クラスが分かれているのはなぜMonad
ですかMonadFix
(つまり、どの型が のインスタンスを持ち、 のインスタンスをMonad
持たないのMonadFix
ですか)?
haskell - FreeT によって生成されたインタープリター モナド トランスフォーマーの MonadFix インスタンス?
によって生成された標準のインタープリターモナドトランスフォーマーの簡略化されたバージョンがありますFreeT
。
p
は「プロンプト」でありr
、「環境」です...次のようなものを使用してこれを実行します:
このタイプは多かれ少なかれ...の制約されたバージョンにすぎないように感じStateT
ます...どちらかといえば...Interactive p r IO
の制約されたバージョンだIO
と思います...私は思う...しかし...まあ、いずれにせよ、私の直感はそれを言います良い例があるはずです。
書いてみましたが、よくわかりません。これまでの私の最も近い試みは次のとおりです。
MonadFix
のインスタンスを利用したバージョンも試してみましたm
が、うまくいきませんでした -
これが本当に可能かどうか、または不可能な理由を知っている人はいますか? もしそうなら、私が探し続けるのに適した場所はどこですか?
あるいは、私の実際のアプリケーションでは、実際に使用する必要さえありませんFreeT
...使用するだけFree
です。つまり、Interactive
ただのモナド変換子ではなく、ただのモナドであり、
一般的な FreeT のケースではなく、このケースで何かが可能であれば、私も嬉しいです:)
haskell - ラムダ式のチルダの意味は何ですか?
この本の 7 ページにあるtoggle
. チルダの意味は?
list - [] の MonadFix インスタンス
インスタンスは次のように定義されます。
[]
しかし、非決定論的計算と見なされるモナドに関して、その背後にある直感的な意味を把握できていません。In mfix f
functionf
はその引数で厳密であってはならないため、引数を調べることができません。また、定義によれば、出力のどこでも引数を使用することはできません。そうしないと、ある時点でヒットfix (f . head)
して発散します。mfix
では、 for リスト以外の用途 (または良い例) はありますmfix (const someList)
か?
haskell - Haskell の RecursiveDo で生成された複製 EDSL コード
-O2 フラグでコンパイルされた ghc v8.0.1 を使用。
RecursiveDo (mdo) に問題があります。同じ出力を生成するわずかに異なる関数が 2 つありますが、そうではありません。
次の関数は正しい出力を生成します。
正しい出力は
次の関数は、正しくない出力を生成します。
間違った出力は
0007 から 000A までの行は 0003 から 0006 までの行の複製であり、(この特定のケースでは) 最終結果は 0007 での無限ループです。
問題のコードは、Haskell で EDSL (Ting Pen のアセンブラー) を実装しています。プログラムの出力は、Ting Pen のマシン コードです。
アセンブリ言語で前方ラベルをキャプチャできるように MonadFix を使用していますが、コード コンビネータを使用すると、正しくない出力が得られます (生成されたコードの一部が複製されます)。いくつかのトレース コードを含めて、コード生成をトレースすることができます。RecursiveDo メカニズムが重複コードを生成する何かを実行するポイントがあります (以下に示すプログラムの出力も参照してください)。
プログラムの出力は次のとおりです。
proc1 からの誤った出力:
これは、コードの重複が発生する場所です。
proc2 からの正しい出力: