問題タブ [monadplus]
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で非決定論的モナド変換子を構築する
私は、Haskellで非決定論的なモナド変換子を構築したいと思います。これは、ListTやhttp://www.haskell.org/haskellwiki/ListT_done_rightで提案されている代替のListTとは異なる動作をすると思います。これらの最初のものは、モナドをアイテムのリストに関連付けます。2つ目は、モナドを個々のアイテムに関連付けますが、特定の要素のモナドアクションが、リストの後続のスロットのモナド要素に影響を与えるというプロパティを持っています。目標は、次の形式のモナド変換子を作成することです。
リストのすべての要素に独自のモナドが関連付けられ、連続する要素には独立したモナドが関連付けられます。この投稿の最後に、このモナドが与えるべき動作の種類について少し説明します。この動作を実現するためにListTのバリアントを取得する方法を知っている場合は、それも役立ちます。
以下は私の試みです。unpack
関数が定義されていないため、不完全です。どうすれば定義できますか?Empty
これを定義するための不完全な試みが1つありますが、モナドmにAmbリストが含まれている場合は処理されません。
完全な(不完全な)コード:
望ましい動作の例
ここで、ベースモナドはState Int
ありがとう。
更新:LogicTが私が望むことを行わない理由の例。
上記の簡単な例でLogicTが行うことは次のとおりです。
haskell - ErrorT の上にトランスフォーマー用の MonadPlus インスタンスを定義する
とりわけ、基本モナドにエラー機能を付与するモナド変換子を定義したいと思います。変換されたモナドは、ベース モナドが MonadPlus のインスタンスである必要がありますが、MonadPlus インスタンスを定義して、ErrorT トランスフォーマーが複数の回答を返すようにする方法がわかりません (複数の回答がある場合)。私の 2 つの試みは、以下のコードにあります。コードの最後には、ベース モナドが の場合にモナド変換子がどのように動作するかを示すステートメントがあり[]
ます。ありがとう。
haskell - このHaskell関数は別の名前として知られていますか/実装されていますか?
私が自分で一緒にジグザグしているものの多くは、実際には私が知らなかった標準の実装を持っているので、誰かが以前にこのタイプのものが使用されたのを見たことがあると言うことができるかどうか興味がありました:
これはモナディック関数を取り、代替によって述語が選択されるまでそれをフォールドし、その後、述語の結果を返します。
名前はプレリュードの衝突であることに気づきました。おそらく別の名前を付けますが、私が知らない標準ライブラリに同様の機能がすでにあるかどうかを最初に確認したいと思いました。
また、私が書いた構図の代替案が他の場所で定義されているのか、それともこの機能のいずれかが最初から誤った方向に進んでいるように見えるのか、興味があります。しかし、私の質問の核心は、これは他の場所で実装されているのか、それとも他の場所で非常によく似たものであるのかということです。
haskell - モノイド vs モナドプラス
私は両方に非常に慣れていないMonads
とMonoids
について最近知りましたMonadPlus
。私が見たところ、Monoid
どちらMonadPlus
も連想二項演算とアイデンティティを備えた型を提供しています。(私はこれを数学用語で半群と呼びます。) では、 と の違いは何Monoid
ですかMonadPlus
?
haskell - 不要な配布のない Control.MonadPlus.Free
>>=
無料のモナドを使用して、Prolog のようなAND にマップされ、OR にマップされたAND/OR 決定木を構築するための EDSL を構築しようとしていますmplus
。のようなものを記述できるようにしたいのA AND (B OR C) AND (D OR E)
ですが、分配性によってこれが に変わることは望ましくありません(A AND B AND D) OR (A AND B AND E) OR (A AND C AND D) OR (A AND C AND E)
。最終的には、AND/OR ノードを制約ソルバーで具体化された制約に変換したいと考えています。ソルバーに処理させたい選択肢の数が爆発的に増えることはありません。
ではControl.MonadPlus.Free
、の各モナドの下にあるそれぞれの葉に適用されるPlus ms >>= f
原因。置換する葉ごとに異なる値が生成される可能性があるため、これが必要です。f
Pure
ms
f
Pure
ただし、 ではPlus ms >> g
、g
の葉の影響を受けないms
ため、 に配布するPlus
必要はないようです。
試行錯誤の結果、Control.MonadPlus.Free
モナドを新しいThen
コンストラクタで拡張できることがわかりました。
ここで、新しいThen
コンストラクタは、値を無視するモナドのシーケンスを保持し、その後に実際の値を生成する最後のモナドが続きます。新しいMonad
インスタンスは次のようになります。
演算子は>>
、既存の葉を で置き換えることによって「キャップ」Pure a
しPure ()
、キャップされたモナドをリストに追加し、値モナドを新しいものに置き換えます。新しいモナドを で追加することの非効率性は認識していますが、新しいモナドをチェーンの最後に でステッチ++
するのと同じくらい悪いと思います (そして、継続を使用して全体を書き換えることができます)。>>=
fmap
これは合理的なことのように思えますか? これはモナドの法則に違反していますか(これは問題ですか?)、または既存のを使用するより良い方法はありControl.Monad.Free
ますか?
haskell - モナド変換子型クラス内でリストモナドを使用しますか?
私の目標は、ReaderT WriterT スタックまたは RWS スタックのいずれかの内部でリスト モナドを使用する関数を作成することです。より一般的には、MonadReader、MonadWriter などの mtl 型クラス内で list モナドを使用するにはどうすればよいですか?
なぜ私はこれをやろうとしているのですか?この問題は、 Beginning Haskellの練習問題です。「ベースリストモナドをラップするMonadReaderとMonadWriterの両方の機能を使用するように求められます。関数が一般的であることを確認するには、2つの異なるモナドを使用して、要求された機能を[テスト]します。ReaderT r (WriterT w []) a
」RWST r w s m a
したがって、本はこれが可能であることを暗示しています。
リストモナドを使用するようにコンパイラに「指示」する方法がわかりません。2 レベル スタック ( ) または 3 レベル スタック ( ) のいずれかを使用するか、ask >>= lift
両方を使用することはできませんが、両方を使用することはできません。ask >>= lift . lift
RWST []
ReaderT WriterT []
私の質問の焦点:
さらに、関数の入力方法を知りたいです。pathImplicitStack' :: (MonadReader [(Int, Int)] m, MonadWriter [Int] m, MonadPlus m) => Int -> Int -> m ()
これまでの私の最善の試みは、これが正しくないことを知っているように見えます。リストモナドがおそらく欠落しています。また、MonadPlus は型シグネチャに役立つ可能性があると思いますが、よくわかりません。
この行:do (s0, e0) <- ask >>= lift
私に問題を引き起こしているものです。0、1、および 2 回のリフトを試しましたが、成功しませんでした。ask
aを処理したいのですが[(Int, Int)]
、リスト モナドを使用して a だけを処理します(Int, Int)
(そして、リスト モナドにすべての可能性を試してもらいます)。
演習の一環として、pathImplicitStack'
これらの関数 (または非常に類似した関数) の両方を呼び出すことができる必要があります。
これは、以前の質問に関連しています: ReaderT 内でリスト モナドを使用するにはどうすればよいですか?
簡単にテストするためのファイル全体:
編集
私が試したJohn Lのフィードバックに基づいて
しかし、彼が指摘したように、それはリストモナドをラップするために 1 つのモナド変換子、つまり RSWT でのみ使用でき、ReaderT WriterT では使用できません。したがって、これは私が探している解決策ではありません。
haskell - おそらくMonadPlusパーサーは特定の順序である必要がありますか?
wikibooks/haskellの演習に取り組んでいます。MonadPlusの章に、この hexChar 関数を記述してほしいという演習があります。私の関数は以下のように動作しますが、2 つのヘルパー パーサー (digitParse と alphaParse) を切り替えようとすると、関数が正しく動作しなくなります。それらを切り替えると、数字のみを解析でき、アルファベット文字は解析できなくなります。
これはなぜですか?
loops - MonadPlus が「ジェネレータ」クラスである場合、「コンシューマ」クラスは何ですか?
Aは、ジェネレーター部分 ( ) とコンシューマー部分 ( )Pipe
の 2 つの部分に分けることができます。yield
await
Pipe
ジェネレーターの半分のみを使用し、返すだけ(または決して返さない) がある場合()
、それは「ListT
正しく行われた」として表すことができます。ListT MonadPlus
-done-right のようなものを表すために使用できることがわかりました。ガブリエル・ゴンザレスの引用:
ListT
トランスフォーマーの依存関係のみを使用して、(パイプ内のものだけでなく)任意のものを構築できることに注意してください。たとえば、 のListT
アナログを実装する方法は次のPipes.Prelude.stdinLn
とおりです。それはそこにあるものと同じようにチェックを入力
ListT
し、それらすべてに対して正しいことを行います。
だから私の質問はこれです:パイプのコンシューマー部分にデュアルがListT
ありますか?MonadPlus
要件:
yield
を使用せず、返すだけ()
(または決して返さない) であるが、使用するパイプは、await
この「ListT のデュアル」として表すことができます。- 「ListT の双対」は「MonadPlus の双対」に一般化できます。