問題タブ [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.
haskell - スペースリーク、Writers、および Sums (oh my!)
私は最近 Writer モナドをいじっていて、スペースリークのように見えるものに出くわしました。これらのことをまだ完全に理解しているとは言えませんので、ここで何が起こっているのか、そしてそれを修正する方法を知りたいです.
まず、このエラーをトリガーする方法は次のとおりです。
私は得る:
これをよりよく理解するために、Writer または Sum を使用せずに同様の機能を再実装しました。
seq
しかし、方程式に追加することでこれを修正できます。
seq
関数のさまざまな部分を試してみましfoo
たが、役に立たないようです。また、使用してみましControl.Monad.Writer.Strict
たが、どちらも違いはありません。
Sum
なんか厳しくする必要ある?それとも、まったく違うものを見逃していますか?
ノート
- ここで用語が間違っている可能性があります。Space leak Zooによると、私の問題は「スタック オーバーフロー」に分類されます。その場合、
foo
より反復的なスタイルに変換するにはどうすればよいですか? 私の手動再帰が問題ですか? - Haskell Space Overflowを読んだ後
-O2
、何が起こるかを確認するために、 でコンパイルするという考えが浮かびました。これは別の質問のトピックかもしれませんが、最適化すると、私seq
のbar
関数でさえ実行に失敗します。 更新: を追加すると、この問題はなくなり-fno-full-laziness
ます。
haskell - オペレーショナルモナドで実装されたライターは怠惰に動作しません
オペレーショナルモナドアプローチを使用して、ライター機能を備えたモナドを作成しました。それから私はそれが怠惰に機能しないことに気づきました。
以下のコードには、rogueWriter
それぞれが文字列を書き込む無限に多くのステートメントを実行するがあります。プログラムは終了しませんが、無限出力の一部の文字のみが必要です。
私の分析の後、私がからに変更するrunMyWriter rogueWriter
とrunWriter rogueWriter
、すべてがうまくいくので、不正なライターは実際には非常に友好的であることに気づきました(笑)。
質問:
- 行動を最もよく説明するにはどうすればよいですか?
- コードを機能させるにはどうすればよいですか?
- どのモナド変換
SomeMonadT
子がそれぞれ同じ問題を
SomeMonadT Writer w
引き起こしますか。WriterT w SomeMonad
(おそらくいくつかの例?)
編集:ここで無限の文字列を逆にしようとしている可能性はありますか?SjoerdVisscherのソリューションと私のソリューションの顕著な違いは
コード:
scala - Writer[List[Int], Int] を返す関数を作成するには?
Int => Int
で構成されたいくつかの関数があるとしandThen
ます。
ここで、中間結果も返す必要があります。したがって、これらすべての関数をInt => (List[Int], Int)
、リストに引数が含まれる場所に変換できます。
おそらくペアを表すためWriter[List[Int], Int]
にを使用できます。scalaz
(List[Int], Int)
を構成するfw1
にはfw2
、fw3
おそらく でラップする必要がありますKleisli
。ただし、モナドではKleisli(fw1)
ないためコンパイルされません。Writer[List[Int], Int]
monad transformer
モナドを作るにはおそらく a が必要だと思いWriter[List[Int], Int]
ますが、それを行う方法が正確にはわかりません。だから、私の質問は:Kleisli(fw1)
モナドトランスフォーマーでコンパイルする方法は?
scala - Writer モナドで XML 要素のシーケンスを検証する
これは私の古い質問へのフォローアップです。
XML を検証する必要があるとします。
ルートに、、および(この順序で)のa
子があることを確認する必要があります。a1
a2
a3
List
(の代わりにscalaz.Validation
) とWriter
モナドを使用して、検証エラーを収集したいと思います。そこで、次のような一連の XML 要素を検証する関数を定義します。
これで、XML 要素のラベルを検証する関数を追加できます。
関数を次のように構成できるように再定義すると、次のValidate
ようになります。Kleisli
Validate
andThen
それは理にかなっていますか?どのように修正/簡素化しますか?