問題タブ [scala-streams]
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 Stream.grouped はストリーム全体をメモリにバッファリングします
grouped
Scalaを呼び出すと、Stream
ストリーム全体がメモリにバッファされるようです。ここでかなり掘り下げて、どのクラスが Stream のヘッドへの参照を保持しているかを判断しました。
簡単な例:
このコードを実行してforeach
関数内にブレークポイントを配置すると、ストリームが引き出されるときに、ストリームのヘッドへの参照が保持されていることがわかります。
数回繰り返した後、メモリ内のストリームの以前の「チャンク」への参照がまだあります。
さらに、ストリームのヘッドへの参照を調べると、IterableLike 内の一部のラムダが参照を保持していることがわかります。
がgrouped
で呼び出されるとStream
、コレクション ライブラリは最初に を呼び出しiterator
てStream
を返し、StreamIterator
次にそのイテレータを呼び出して を返しgrouped
ます。上のスクリーンショットは、内部の何かがストリームの先頭を保持しているように見えることを示唆していますが、何が原因かはわかりません。GroupedIterator
GroupedIterator
私の質問は 2 つあります: 1. これは Scala Streams で予期される動作ですか? そうでない場合、StreamIterator と GroupedIterator の実装内で何が起こって、実行中に Stream の先頭が保持される.grouped(N)
のStream
でしょうか?
scala - Scala ストリームをストリームのストリーム (特定のストリームのサフィックス) に変換するための演算子またはメソッド
問題は単純です。要素のストリームを、最初の要素が元のストリーム、2 番目の要素が元のストリームの末尾、3 番目の要素が末尾の末尾などの要素のストリームに変換します。 ..
例: (1, 2, 3, ...) は ((1, 2, 3, ...), (2, 3, 4, ...), (3, 4, 5, ...) になります。 、...)
私の質問は、このストリームを取得する方法が単純であるため正確ではありませんが、慣用的な方法でこれを行うメソッドまたは演算子が既に存在するかどうかです。そのような方法がない場合に備えて、この操作の適切な名前も探しています。拡張または展開は実際にはうまくいかないと思いますが、これらの線に沿ったものです.
更新:背景は、タイプの関数がStream[A] => B
あり、入力ストリームのすべてのサフィックスのストリームにマップしたいということです。Stream[Stream[A]]
したがって、ストリームを最初のストリームに変換してマップすることが実用的と思われます。これは私のコードで繰り返されるパターンのように見えるため、適切な名前が必要です。
scala - lazy 'take' 関数はどのように Scala ストリームをさらに計算しますか?
Martin Odersky の著書「Programming in Scala」には、関数 fibFrom に引数として渡された 2 つの数値から始まるフィボナッチ数列を計算する例があります。
メソッド take() をこの再帰関数に適用すると、次のようになります。
出力は次のようになります。
この出力は経験豊富な人にとっては明らかかもしれませんが、このメソッド take() がストリームをさらに計算する方法を正確に理解していません。15 はどういうわけか非自明に fibFrom() に渡されますか?