代码之家  ›  专栏  ›  技术社区  ›  sof

在懒惰的序列上无休止地循环

  •  2
  • sof  · 技术社区  · 7 年前

    butlast 在Clojure中无休止地循环?

    user=> (->> (range) butlast lazy-seq (take 0))
    ()
    user=> (->> (range) butlast lazy-seq first) ; ...
    

    ghci> take 0 . init $ [0..]
    []
    ghci> head . init $ [0..]
    0
    

    编辑

    take 0 没有下文指出的op。

    2 回复  |  直到 7 年前
        1
  •  1
  •   gfredericks    7 年前

    如果你看看 butlast loop 而不是 lazy-seq ). 另一种惰性实现可以满足您的需要:

    (defn butlast'
      "Like clojure.core/butlast but lazy."
      [xs]
      (when (seq xs)
        ((fn f [[x & xs]]
           (if (seq xs)
             (lazy-seq (cons x (f xs)))
             ()))
         xs)))
    
        2
  •  2
  •   Taylor Wood    7 年前

    为什么在Clojure中第二个评估循环是无止境的?

    butlast

    在两个版本中 是消除上游懒惰,所以我认为另一个相关的问题是“为什么第一个版本会在 但最后 是否涉及?”: take 0 不是一个正数,所以不管你传递什么。

    head . tail $ [0..] 可能是:

    (->> (range) rest first) ;; => 1
    

    但最后

    推荐文章