Clojureの関数なぜlazy関数呼び出しだけで構成されるClojure関数も怠惰ですか?
(reductions + 0 (cycle [1 1 -1]))
はシーケンス[0 1 2 1 2 3 2 3 4 3 4 5 ...]を生成します。残念ながら、このシーケンスは怠惰ではありません。
cycle
とreductions
は両方とも遅延型の返り値として記述されていますが、これらの関数の組み合わせが遅延型のシーケンスを返すことも期待していました。なぜそれをしないと、シーケンスを遅く返すためにそれを修正できますか?
同じ問題を示して、より複雑な例:
(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec]))
(これは私がすべての違いを作る場合には、最後に作業しているしたいバージョンの一種であるので、私は、これを示します)
ありがとうございました。私はそれを防ぐために(def ...)宣言でシーケンスのエイリアスを試みましたが、もちろん動作しません(今は実現しています)。それを(defn ...)と命名しても問題ありません。 – Confusion
関数が怠惰であるかどうかをより正確に確認するには、関数をラップして実装していますか? 。それがfalseを返す場合、関数は遅延です。 =>(実現?(リダクション+0(サイクル[1 1 -1]))) false – NielsK
'実現? '[]'、 ''(a b c) '、' '(iterate inc 0)'のすべての値に '実現してみましょうか?'と試してみると、私の言いたいことが分かります。 – amalloy