代码之家  ›  专栏  ›  技术社区  ›  Paul C

为什么在更新上下文中按预期工作时没有drop,而map会这样做?

  •  0
  • Paul C  · 技术社区  · 5 年前

    (deftest test-weird
      (let [x {:nums [1 2 3 4 5 6 7 8]}
            res (update x :nums #(map even? %))]
        (println res)))
    

    结果: {:nums (false true false true false true false true)}

    如果我用这个 drop-while

    (deftest test-weird
      (let [x {:nums [1 2 3 4 5 6 7 8]}
            res (update x :nums #(drop-while even? %))]
        (println res)))
    

    结果: {:nums (1 2 3 4 5 6 7 8)}

    我做错什么了?

    1 回复  |  直到 5 年前
        1
  •  4
  •   Alan Thompson    5 年前

    第一项是 1 ,这是不均匀的。因此,不会从序列中删除任何项。

    你真正想要的是 #(remove even? %) . 不过,我认为这样读起来更好 #(filterv odd? %)

    另请注意,还有一个渴望(vector)版本 filterv 我一直喜欢的(没有这样的选择) remove ).

    请看 this list of documentation . 尤其是每天学习Clojure的秘籍!


    当名字 filter true 谓词被删除或保留。定义是:

    - filter => "keep-if true ..."
    - remove => "drop-if true ..."
    

    在我自己的代码中,我通常更喜欢使用 a simple alias

        2
  •  0
  •   Gwang-Jin Kim    5 年前

    而不是 #(drop-while even? %) 删除集合中的所有元素,直到 true

    • 或者: #(filterv (comp not even?) %)
    • #(remove even? %)
    推荐文章