5

Clojure関数

(reductions + 0 (cycle [1 1 -1]))

シーケンス[012 1 2 3 2 3 4 3 45...]を生成します。残念ながら、このシーケンスは怠惰ではありません。

cycleとは両方ともレイジーシーケンスを返すものとして文書化されているのでreductions、これらの関数のこの組み合わせがレイジーシーケンスも返すことを期待していました。なぜそれができないのですか、そしてどうすればシーケンスを怠惰に返すように修正できますか?

同じ問題を示すより複雑な例:

(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec]))

(これは、何か違いが生じた場合に備えて、最終的に機能させたいバージョンであるため、これを示します)

4

1 に答える 1

9

残念ながら、このシーケンスは怠惰ではありません。

そうそうそうです。最初の10個の要素を取得することで、怠惰であることをすばやく確認できます。

(take 10 (reductions + 0 (cycle [1 1 -1])))

これは非常に迅速に答えを返し、シーケンスが怠惰であることを証明します。関数が怠惰でない場合、無限シーケンスのすべての要素を実現しようとし、メモリを破壊するか、無限ループでハングします。

何が起こるかというと、REPLでこの関数を入力しているということです。REPLは、シーケンスを表示する前に、シーケンスを実現しようとします。

編集:このヒントを使用して、無限ループをトリガーしたか、誤って無限ループを実現しようとしたことがわかった場合は、このヒントを使用して無限ループを停止します。

于 2012-07-08T20:59:30.713 に答える