問題タブ [lazy-evaluation]
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.
performance - Haskellの怠惰と末尾再帰、なぜこれがクラッシュするのですか?
これまでの合計とこれまでのカウントを保持するために2つのアキュムレータを使用して、大きなリストの要素の平均を計算するこの非常に単純な関数があります。
さて、厳密な言語では、これは末尾再帰であり、問題はありません。しかし、Haskellは怠惰なので、私のグーグルは、(s + x)と(l + 1)がサンクとして再帰に渡されることを理解するようになりました。したがって、このすべてがクラッシュして燃えます:
さらにグーグルした後、私は見つけましseq
た$!
。このコンテキストでそれらを使用しようとしたすべての試みが無駄であり、エラーメッセージが無限の型について何かを言っているので、私は理解していないようです。
最後に-XBangPatterns
、再帰呼び出しを変更することですべてを解決するを見つけました。
-XBangPatterns
しかし、現在の拡張機能であるため、これには満足していません。を使わずに厳密に評価する方法を教えて-XBangPatterns
ください。(そして多分何かを学ぶことも!)
私の理解の欠如を理解するために、これが私が試したことです(コンパイルされた唯一の試みです):
私が理解できたことから、seqはここでsとlの引数の評価を強制し、サンクによって引き起こされる問題を回避する必要があります。しかし、それでもスタックオーバーフローが発生します。
clojure - この Clojure 呼び出しを遅延シーケンスに変換します
私はメッセージング ツールキットを使用しています (たまたまスプレッドですが、詳細が重要であることはわかりません)。このツールキットからメッセージを受信するには、定型文が必要です。
- デーモンへの接続を作成します。
- グループに参加します。
- 1 つ以上のメッセージを受信します。
- グループを離れます。
- デーモンから切断します。
他の場所で使用されているのを見たイディオムに従って、Spread の Java API と Clojure の相互運用フォームを使用して、いくつかの機能を作成することができました。
(基本的には と同じイディオムwith-open
ですが、SpreadConnection
クラスが . Grrdisconnect
の代わりに使用するだけclose
です。また、ここでの構造的な問題に関係のないマクロをいくつか省略しました。)
これは十分に機能します。次のような構造体の内部から receive-message を呼び出すことができます。
receive-message
メッセージを生成する無限の遅延シーケンスである場合、使用するのがよりクリーンになると思います。したがって、グループに参加してメッセージを受け取りたい場合、呼び出しコードは次のようになります。
クリーンアップのない遅延シーケンスの例をたくさん見てきましたが、それほど難しくありません。問題は、上記のステップ 4 と 5 です。グループを離れ、デーモンから切断します。接続とグループの状態をシーケンスにバインドし、シーケンスが不要になったときに必要なクリーンアップ コードを実行するにはどうすればよいですか?
clojure - Clojure で遅延シーケンスを非遅延シーケンスに変換する方法
非遅延シーケンスのクラスが返されることを期待して、Clojureで次のことを試しました。
ただし、これはまだ を返しますclojure.lang.LazySeq
。私の推測ではdoall
、シーケンス全体を評価しますが、元のシーケンスはメモ化に役立つため、元のシーケンスを返します。
では、遅延シーケンスから非遅延シーケンスを作成する慣用的な手段は何ですか?
python - Python: レイジー文字列デコード
私はパーサーを書いていて、デコードするテキストがたくさんありますが、ほとんどのユーザーはすべてのデータからいくつかのフィールドしか気にしません。したがって、ユーザーが実際にデータの一部を使用する場合にのみ、デコードを実行したいと考えています。これは良い方法ですか?
それは私がオーバーライドする必要がある唯一の方法ですか?
compiler-construction - 遅延評価された小さな言語を作成するアプローチを開始する方法
リスト内包表記やラムダ関数など(すでに作成済み)を使用して、Javaと同様の構文と文法構造を持つ小さな言語を構築しようとしています。
私が今やろうとしているのは、熱心に評価するのではなく、この言語を遅延評価する表現にしたいと思っています。部分評価の仕方がよくわからないので、どうしたらいいのかよくわかりません。
私はたくさんのグーグルをして、答えを思い付かなかったので、ここの誰かがこれについて良い参考文献を持っているかどうか疑問に思いました。
テイカーはいますか?
haskell - peekCStringとpeekCStringLenは怠惰ですか?
nullで終了する文字列を作成し、その文字列へのポインタを返すC関数があります。また、対応する割り当て解除関数もあります。
返されたCStringからHaskell文字列を作成し、できるだけ早くCStringを解放したいと思います。
strを使用する前にcStrを解放しても安全ですか?言い換えれば、peekCStringはHaskell Stringを一度に作成しますか、それとも怠惰に作成されますか?
list - F# で分解されたシーケンスと一致することは可能ですか?
F# の古いバージョンでは、リストと同じようにシーケンスを照合するときに構造分解が可能だったことを覚えているようです。シーケンスを怠惰に保ちながらリスト構文を使用する方法はありますか? Seq.head と Seq.skip 1 への多くの呼び出しを避けたいと思っています。
私は次のようなことを望んでいます:
ただし、これはリストのみを処理し、シーケンスを使用すると型エラーが発生します。List.of_seq を使用すると、無限であっても、シーケンス内のすべての要素を評価するようです。
clojure - Clojure: 怠惰な魔法
ランダムの無限の遅延シーケンスを生成するほぼ 2 つの同一のプログラム。最初はクラッシュしません。OutOfMemoryError 例外による 2 番目のクラッシュ。なんで?
しかし、次のクラッシュはかなり早く発生します。