gpt4 book ai didi

Clojure:调用包含的惯用方式?在惰性序列上

转载 作者:行者123 更新时间:2023-12-04 03:21:58 25 4
gpt4 key购买 nike

是否有一种惯用的方法来确定 LazySeq 是否包含一个元素?从 Clojure 1.5 开始,调用 contains? 会抛出一个 IllegalArgumentException:

IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq      
clojure.lang.RT.contains (RT.java:724)

在 1.5 之前,据我所知,它总是返回 false。

我知道在 LazySeq 上调用 contains? 可能永远不会返回,因为它可以是无限的。但是如果我知道它不是并且不在乎它是否被急切地评估呢?

我想出的是:
(defn lazy-contains? [col key]
(not (empty? (filter #(= key %) col))))

但感觉不太对劲。有没有更好的办法?

最佳答案

首先,lazy seqs 在检查成员资格方面效率不高。考虑使用集合而不是惰性序列。

如果一套不切实际,你的解决方案还不错。几个可能的改进:

  • "Not empty"有点别扭。仅使用 seq 就足以获得一个 nil-or-truthy 值,您的用户可以在 if 中使用该值。如果您想要 true 或 false,您可以将其包装在 bool 值中。
  • 既然你只关心第一个匹配,你可以用 some 代替 filter 和 seq。
  • 编写相等谓词的一种方便的方法是使用文字集,如#{key},但如果key 为nil,则无论nil 是否存在,这将始终返回nil。

  • 所有这些都为您提供:
    (defn lazy-contains? [col key]
    (some #{key} col))

    关于Clojure:调用包含的惯用方式?在惰性序列上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16264813/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com