問題タブ [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 投票する
3 に答える
1592 参照

haskell - スペースリーク、Writers、および Sums (oh my!)

私は最近 Writer モナドをいじっていて、スペースリークのように見えるものに出くわしました。これらのことをまだ完全に理解しているとは言えませんので、ここで何が起こっているのか、そしてそれを修正する方法を知りたいです.

まず、このエラーをトリガーする方法は次のとおりです。

私は得る:

これをよりよく理解するために、Writer または Sum を使用せずに同様の機能を再実装しました。

seqしかし、方程式に追加することでこれを修正できます。

seq関数のさまざまな部分を試してみましfooたが、役に立たないようです。また、使用してみましControl.Monad.Writer.Strictたが、どちらも違いはありません。

Sumなんか厳しくする必要ある?それとも、まったく違うものを見逃していますか?

ノート

  • ここで用語が間違っている可能性があります。Space leak Zooによると、私の問題は「スタック オーバーフロー」に分類されます。その場合、fooより反復的なスタイルに変換するにはどうすればよいですか? 私の手動再帰が問題ですか?
  • Haskell Space Overflowを読んだ後-O2、何が起こるかを確認するために、 でコンパイルするという考えが浮かびました。これは別の質問のトピックかもしれませんが、最適化すると、私seqbar関数でさえ実行に失敗します。 更新: を追加すると、この問題はなくなり-fno-full-lazinessます。
0 投票する
1 に答える
192 参照

haskell - オペレーショナルモナドで実装されたライターは怠惰に動作しません

オペレーショナルモナドアプローチを使用して、ライター機能を備えたモナドを作成しました。それから私はそれが怠惰に機能しないことに気づきました。

以下のコードには、rogueWriterそれぞれが文字列を書き込む無限に多くのステートメントを実行するがあります。プログラムは終了しませんが、無限出力の一部の文字のみが必要です。

私の分析の後、私がからに変更するrunMyWriter rogueWriterrunWriter rogueWriter、すべてがうまくいくので、不正なライターは実際には非常に友好的であることに気づきました(笑)。

質問:

  1. 行動を最もよく説明するにはどうすればよいですか?
  2. コードを機能させるにはどうすればよいですか?
  3. どのモナド変換SomeMonadT子がそれぞれ同じ問題を
    SomeMonadT Writer w引き起こしますか。WriterT w SomeMonad (おそらくいくつかの例?)

編集:ここで無限の文字列を逆にしようとしている可能性はありますか?SjoerdVisscherのソリューションと私のソリューションの顕著な違いは

コード:

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

scala - Writer[List[Int], Int] を返す関数を作成するには?

Int => Intで構成されたいくつかの関数があるとしandThenます。

ここで、中間結果も返す必要があります。したがって、これらすべての関数をInt => (List[Int], Int)、リストに引数が含まれる場所に変換できます。

おそらくペアを表すためWriter[List[Int], Int]にを使用できます。scalaz(List[Int], Int)

を構成するfw1にはfw2fw3おそらく でラップする必要がありますKleisli。ただし、モナドではKleisli(fw1)ないためコンパイルされません。Writer[List[Int], Int]

monad transformerモナドを作るにはおそらく a が必要だと思いWriter[List[Int], Int]ますが、それを行う方法が正確にはわかりません。だから、私の質問は:Kleisli(fw1)モナドトランスフォーマーでコンパイルする方法は?

0 投票する
0 に答える
85 参照

scala - Writer モナドで XML 要素のシーケンスを検証する

これは私の古い質問へのフォローアップです。

XML を検証する必要があるとします。

ルートに、、および(この順序で)のa子があることを確認する必要があります。a1a2a3

List(の代わりにscalaz.Validation) とWriterモナドを使用して、検証エラーを収集したいと思います。そこで、次のような一連の XML 要素を検証する関数を定義します。

これで、XML 要素のラベルを検証する関数を追加できます。

関数を次のように構成できるように再定義すると、次のValidateようになります。KleisliValidateandThen

それは理にかなっていますか?どのように修正/簡素化しますか?