問題タブ [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.
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
child
とchildren
私が書くことができる両方を考えると、a
上記の XML の検証関数:
それは理にかなっていますか?このデザインをどのように修正/拡張しますか?
monads - 「do」ブロック (PureScript) 内の Writer モナドの値とアキュムレータの両方にアクセスするにはどうすればよいですか?
私は現在 Writer モナドについて学んでいますが、do
ブロック内のモナドの値とアキュムレータの両方を読み取ることが正しいかどうかはわかりません。たとえば、以下の coltzSeq 関数では、配列アキュムレータの長さを関数の最終計算として読み取りたいと考えています。これを行うことは可能ですか、またはこれは Writer の不適切な使用ですか? 明らかに、呼び出し元に最終的な配列の長さを読み取らせるか、State モナドを使用することができますが、これは単なる演習です。
編集: gb. の提案を試し、listens
type を持つ関数を使用してみました(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
。
haskell - Writer モナドが 2 回入れ子になっている
Monad Transformers を使用して、Writer モナドを 2 回入れ子にしようとしています。ここにスケッチがあります:
ではなくモナドで使用する必要があるため、foo
関数はコンパイルされません。それはまったく可能ですか?tell
Struct
Collision
haskell - Writer モナドの mappend を入れ替える
mappend
概要: Writer モナドを使用しているときに、状態を失うことなくの 2 つの異なるバージョンを切り替えられるようにしたいと考えています。
いくつかの状態を追跡するために、2 つのブール値フラグを使用します。
Monoid
次に、フラグを組み合わせる方法が異なる2 つのインスタンスを定義しmappend
ます。
これで、異なるフラグ処理を持つ 2 つの Writer モナドを持つことができます:
これで、次のような操作を実行できます。
次のような式を作成したいと思います。
そのためには、フラグを失うことなく、できれば ( を使用してrunWriter
) モナドをアンラップすることなく、2 つの間で変換できる必要があります。この部分は私が把握していません。モナドトランスフォーマーを使用してライターをネストできるように少し見えますが、ここで直接適用できるかどうかはわかりません。このようなものを実装するための最良の方法について、いくつかのガイダンスをいただければ幸いです。