使用一些候选元素中的元素组成一个小列表,其中每个元素的包含取决于一个独立的谓词?

时间:2014-11-05 00:57:47

标签: clojure

假设我想要返回包含[1 2 3 4]的某个子集的集合。是否包含1取决于w ?,是否包括2取决于x?,y?3,z?4。

如果我做了

[(if (w?) 1) (if (x?) 2) (if (y?) 3) (if (z?) 4)]

并且(x?)和(y?)评估为真,其他人为假,我最终

[nil 2 3 nil]

但我想要

[2 3]

有没有规范的方法来实现这一目标?它让人联想到列表理解,但不完全相同。

由于

编辑:

我猜我可以创建一张地图{1 w? 2 x? 3年? z 4?}然后reduce根据它的值函数是否评估为真,可以通过消耗或不消耗每个键,但也许有更好的方法。

1 个答案:

答案 0 :(得分:1)

这可以做你想要的:

(defn f [conds vs]
  (when (seq vs)
    (let [[c1 & cr] conds
          [v1 & vr] vs]
      (if c1 
        (cons v1 (f cr vr))
        (f cr vr)))))

示例:

(f [false true true false] [1 2 3 4])
=> (2 3)

(f [true true false true false true] [1 2 3 nil 4 5])
=> (1 2 nil 5)