問題タブ [writer-monad]

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.

0 投票する
1 に答える
137 参照

scala - Scala で Writer と Kleisli を使用して XML を検証する

これは私の前の質問のフォローアップです

次のような XML を検証する必要があるとします。

ルート要素にラベルがあり、この順序でa<a1>xxx</a1>、があることを確認する必要があります。<a2>yyy</a2><a3>zzz</a3>

List[String]エラーを収集し、次のような単一の XML 要素を検証する関数を定義するために使用したいと思います。

これで、特定の XML 要素のラベル、テキスト、および属性を検証する関数を作成できるようになりました。

はモノイドである|+|ため、これらの関数を構成できます。ValidateSingleElement

ここで、特定の要素の子を検証する関数が必要です。このような関数を作成するには、要素 のシーケンスを検証する別の関数が必要です

ValidateElements次のように定義されます。

一連の要素をトラバースしながらエラーを収集するためにList[String]andモナドを使用しています。Writer

これで、特定の要素の子を検証する関数を作成できます。

...そして、シーケンスの最初の要素を検証します:

ValidateElements最後に、次のように再定義できますKleisli

...そして、関数の代わりにchildを返すように書き直します。Kleisli

childchildren私が書くことができる両方を考えると、a上記の XML の検証関数:

それは理にかなっていますか?このデザインをどのように修正/拡張しますか?

0 投票する
2 に答える
106 参照

monads - 「do」ブロック (PureScript) 内の Writer モナドの値とアキュムレータの両方にアクセスするにはどうすればよいですか?

私は現在 Writer モナドについて学んでいますが、doブロック内のモナドの値とアキュムレータの両方を読み取ることが正しいかどうかはわかりません。たとえば、以下の coltzSeq 関数では、配列アキュムレータの長さを関数の最終計算として読み取りたいと考えています。これを行うことは可能ですか、またはこれは Writer の不適切な使用ですか? 明らかに、呼び出し元に最終的な配列の長さを読み取らせるか、State モナドを使用することができますが、これは単なる演習です。

編集: gb. の提案を試し、listenstype を持つ関数を使用してみました(Monoid w, Monad m) => forall w m a b. MonadWriter w m => (w -> b) -> m a -> m (Tuple a b)idこのコンテキストで使用すると、型は次のようになります...

したがって、listens idを受け入れWriter (Array Number) Number)、値が現在の Writer 状態である Writer を返します ( を使用したためid)。ただし、試して使用するすべての方法で型エラーが発生し続けますlistens

Edit2: 何をする必要があるかを理解しました。何らかの理由で、使用時に型注釈を追加する必要がありましたlistens

0 投票する
1 に答える
132 参照

haskell - Writer モナドが 2 回入れ子になっている

Monad Transformers を使用して、Writer モナドを 2 回入れ子にしようとしています。ここにスケッチがあります:

ではなくモナドで使用する必要があるため、foo関数はコンパイルされません。それはまったく可能ですか?tellStructCollision

0 投票する
1 に答える
120 参照

haskell - Writer モナドの mappend を入れ替える

mappend概要: Writer モナドを使用しているときに、状態を失うことなくの 2 つの異なるバージョンを切り替えられるようにしたいと考えています。

いくつかの状態を追跡するために、2 つのブール値フラグを使用します。

Monoid次に、フラグを組み合わせる方法が異なる2 つのインスタンスを定義しmappendます。

これで、異なるフラグ処理を持つ 2 つの Writer モナドを持つことができます:

これで、次のような操作を実行できます。

次のような式を作成したいと思います。

そのためには、フラグを失うことなく、できれば ( を使用してrunWriter) モナドをアンラップすることなく、2 つの間で変換できる必要があります。この部分は私が把握していません。モナドトランスフォーマーを使用してライターをネストできるように少し見えますが、ここで直接適用できるかどうかはわかりません。このようなものを実装するための最良の方法について、いくつかのガイダンスをいただければ幸いです。