2014-11-05 80 views
0

假设我想返回一个包含[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,通过是否考虑每个键取决于它的值函数是否为真,但也许有更好的方法。

+0

或者你可以只筛选出尼尔斯你生成列表后 – soulcheck 2014-11-05 01:25:48

+0

'(除去零[零2 3零] )'? – ntalbs 2014-11-05 01:28:09

+0

我想到了这一点,但如果零是有意识的候选元素之一呢?似乎不太可能,但可能。 – user3391564 2014-11-05 01:33:05

回答

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) 
+0

谢谢,我喜欢它。我想我希望有一个更内在的或标准化的方式来做到这一点,因为它看起来有点平常,但这并不坏。 – user3391564 2014-11-05 01:45:58

+0

如果你不关心丢失nils那么它更容易。在大多数情况下,我们想要删除nils。 – 2014-11-05 01:54:39

+0

对。如果我们想删除nils,那么删除nil?的方法与我以第一种方式生成列表的方式结合起来可能是最好的方法吗? – user3391564 2014-11-05 02:20:19

相关问题