11

次のように、clojure でシーケンスの適切なヘッド/テール分解を取得できることを示す例をいくつか見ます。

(if-let [[x & xs] (seq coll)]

ただし、これは値をベクトルに入れるため、遅延シーケンスでは期待どおりに機能しないと思いますが、これは遅延ではありません。ベクトル形式をリスト形式に変更しようとしましたが、引用されているかどうかにかかわらず、バインディング エラーが発生しました。

このようなバインディングがなければ、各要素が前の要素の計算集約的な方程式である遅延シーケンスを取得した場合、頭と尾を別々のステートメントとして取得するためにその計算を 2 回行う必要があるようです。右?

(let [head (first my-lazy-seq) ;; has to calculate the value of head.
      tail (rest my-lazy-seq)] ;; also has to calculate the value of head to prepare the rest of the sequence.

これを回避する方法はありますか、それともどこかで間違った仮定をしていますか?

4

2 に答える 2

11
user=> (let [[x & xs] (range)] [x (take 10 xs)])
[0 (1 2 3 4 5 6 7 8 9 10)]

xsはまだレイジー seq であるため、問題なく構造化を使用できます。ただし、これにより の最初の要素が強制されxsます。(分解ではベクトル表記を使用しますが、必ずしも内部でベクトルを使用するとは限りません。)

2 番目の質問に関して: レイジー seqs は結果をキャッシュするため、2 番目のオプションも余分な再計算なしで機能します。ヘッドは一度だけ計算されます。

于 2013-05-24T01:28:32.740 に答える