問題タブ [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 - Haskell の相互再帰評価器
更新:最終的な解決策を説明する回答を追加しました(ヒント: 単一のExpr
データ型では不十分でした)。
私は小さな式言語のエバリュエーターを書いLetRec
ていますが、構造に行き詰まっています。
これは言語です:
そして、これはこれまでの評価者です:
これは、評価したいテスト関数です。
編集:
Travis の回答と Luke のコメントに基づいて、エラー モナドに MonadFix インスタンスを使用するようにコードを更新しました。前の例は問題なく動作します。ただし、次の例は正しく機能しません。
これを評価するとき、エバリュエーターはループし、何も起こりません。ここで少し厳しすぎるものを作ったと思いますが、それが何であるかはわかりません。MonadFix 法の 1 つに違反していますか?
haskell - Rand モナドの MonadFix インスタンス
System.Random.MWC.Monadから Rand モナドを使用して無限の数のストリームを生成したいと思います。このモナドの MonadFix インスタンス、または次のようなインスタンスがある場合のみ:
次に、次のように書くことができます。
しかし、1つもありません。
私はMonadFix のドキュメントを調べていましたが、このインスタンスを実装する明確な方法がわかりません。
haskell - モナドで結び目を結ぶのに十分な怠惰を回復する方法はありますか?
結び目を結ぶことで、洗練されたコードを書きたいと思います(そうでなければ実装する時間を大幅に節約できます)。ざっくりこんな感じで、
理論的には、myinstr
を実行x
して値を取得する必要があり、これは になりn
ます。モナドmyinstr
内で実行される は状態に入りますが、これはの計算には影響しません。State
n
x
DoRec
の単純な実装を使用してみましたがmfix
、
しかし、物事は凍結します。コードを修正する方法 (または最初から正しく設計するための方法論) はありますか?
haskell - Cont を使用して未来と過去から値を取得する
私は Haskell でブレインファック インタープリターを書いていますが、プログラムの非常に興味深い説明であると思われるものを思いつきました。
ただし、brainfuck プログラムのテキスト表現をこのデータ型に解析するのは難しいです。角かっこを正しく解析しようとすると問題が発生します。これは、ループ内の最後の部分が再びInstruction
ループにリンクするように結び目を作る必要があるためです。Control
もう少し予備的な情報。すべての詳細については、github リポジトリでこのバージョンを参照してください。
これが私が試したことです:
'['
ケースからケースへ、またはその逆に情報を伝達するために何らかの形で継続を使用できると考えましたが']'
、実際に何かを行うのに十分な Cont の把握がありません。上記のようにpush
とpop
. これはコンパイルして実行しますが、結果はガベージです。
Cont
この状況で結び目を適切に結ぶために使用できますか? そうでない場合、実装するにはどの手法を使用する必要がありますtoProgram
か?
注 1: 以前、微妙な論理エラーloopControl = branch is0
がありました。ブール値が逆になっていたのです。
注2:解決策を考え出すためにMonadFix
(jberrymanの提案に従って)使用することができました( githubリポジトリの現在の状態をState
参照してください)。代わりにこれをどのように行うことができるかを知りたいです。Cont
注 3: 私の Racketeer メンターは、同様の Racket プログラムをまとめてくれました (すべてのリビジョンを参照)。彼のパイプ/パイプアウト手法は、を使用して Haskell に変換できますCont
か?
tl;dr私は MonadFix を使用してこれを行うことができ、他の誰かが Racket の継続コンビネータを使用してそれを行うことができました。Cont
これはHaskellでできると確信しています。方法を教えてもらえますか?
haskell - 州のモナドで結び目を結ぶ
私は大きな結び目を結ぶことを含むHaskellプロジェクトに取り組んでいます:グラフのシリアル化された表現を解析しています。各ノードはファイルにオフセットされており、そのオフセットによって別のノードを参照する場合があります。したがって、解析中にオフセットからノードへのマップを作成する必要があります。これは、do rec
ブロック内で自分自身にフィードバックできます。
私はこれを機能させており、ちょっと-ちょっと-合理的に抽象化されて-風のStateT
モナド変換子になっています:
このtie
関数は魔法が起こる場所です。呼び出しによってrunRecStateT
値と状態が生成され、それを独自の未来としてフィードします。get
過去と未来の両方の状態から読み取ることがput
できますが、「現在」を変更することしかできないことに注意してください。
質問1:これは一般的にこの結び目を結ぶパターンを実装するための適切な方法のように見えますか?またはさらに良いことに、誰かがこれに対する一般的な解決策を実装しましたが、ハッキングを覗き見したときに見落としていましたか?モナドはおそらくもっとエレガントに見えたので(Dan Burtonからの同様の投稿Cont
を参照)、しばらくの間モナドに頭を打ちましたが、うまくいきませんでした。
完全に主観的な質問2:私の呼び出しコードが最終的にどのように見えるかについて私は完全にわくわくしていません:
ここでの実装の詳細は省略されています。明らかに重要な点は、past
and状態を取得し、letバインディング内future
でそれらをパターンマッチングして(または前のパターンを明示的に遅延させて)、気になるものを抽出してから、ノードを構築して更新する必要があることです。私の状態と最後にノードを返します。不必要に冗長に思えますが、特に、と状態を抽出するパターンを誤って厳密にすることがいかに簡単であるかが嫌いです。それで、誰かがより良いインターフェースを考えることができますか?past
future
haskell - Data.Map 実装のバグ?
のバグだと思われるものに出くわしましたが、これは私のHaskellData.Map
の知識のバグである可能性も十分にあります。誰かがそれが何であるかを明確にできることを願っています:)
この要点を参照してください。循環リンク リスト構造をバイトストリームにシリアル化しています。任意のノードに対して、次の形式をとります。
バイトのペアとしてシリアル化されることを期待しています。最初のバイトは を表し、2 番目のバイトはを配置できるval
バイトストリーム内のオフセットを表します。next
たとえば、次のことを期待しています。
として連載予定[0, 1, 1, 0]
。大きな問題ではない。
ここで少しトリッキーな部分は、バイトストリーム オフセットの「結び目を結ぶ」MonadFix
ためにインスタンスを利用していることです。ノードからオフセットへのマップを維持し、シリアル化中にマップにデータを入力しますが、そうでないマップ内のエントリも参照します。RWST
シリアル化が完了するまで、まだ存在する必要があります。
これは、マップの実装がData.HashMap.Lazy
( unordered-containersから) である場合にうまく機能します。ただし、実装が通常の場合Data.Map
(コンテナーMap
から)、プログラム スタックがオーバーフローします (しゃれは意図されていません) (==)
。
私の質問は次のとおりです。これは のバグですか、それとも欠陥があるData.Map
場合にこれらの構造がどのように動作するかについての私の仮定ですか?mfix
haskell - `Free`にMonadFixを実装することは可能ですか?
http://hackage.haskell.org/package/free inをControl.Monad.Free.Free
使用すると、任意のの「無料モナド」にアクセスできますFunctor
。ただし、MonadFix
インスタンスはありません。これは、そのようなインスタンスを記述できないためですか、それとも単に省略されたためですか?
そのようなインスタンスを書き込めないのなら、どうしてですか?
haskell - 厳密な言語でのMonadFix
私はOcamlでhaskellのようなdo表記のcamlp4拡張機能に取り組んでおり、GHCが再帰的なdo-bindings(-XDoRecで有効化)をコンパイルする方法を理解しようとしています。
モナディック不動点コンビネータが厳密な言語(Ocaml / F#/ SML / ...など)で存在することは可能でしょうか?
はいの場合、どのように見えますか?とても便利でしょうか?
haskell - 定点までの反復アクションの型クラス
特定の効果がなくなるまでアクションを実行するという一般的なパターンに気付きましたが、これは固定点を意味する (つまり、将来の効果はあり得ない) ことがわかっている場合です。これには型クラスがありますか?
これはMonadFixでカバーされていますか? コードを見るとそのように見えますが、 wiki ページで「「再帰」を見て、アクションを再帰的にまたは繰り返し実行することを意味すると推測したくなります。いいえ。」に怖がっていました。
また、不動点は恒等の双対のようなものだと私には思えます。つまり、同一性は、非同一性 ((+) の場合は 0、(*) の場合は 1、追加の場合は [] など) と組み合わせると消えます。一方、固定点は、以下の「リラックス」操作で非固定点を非表示にします。この双対性を形式化する方法はありますか?そうすると便利ですか? つまり、MonadPlus および/または Monoid と MonadRelax の間に関係はありますか?
最後に、リラックスはほぼ展開/アナモフィズムであることに気付きました。と表現した方が良いでしょうか?