如何仅作为地图操作的结果返回truthy值

时间:2012-09-20 18:03:55

标签: clojure

我在下面有一个函数来返回元音。但是我想只返回真值,我该怎么做?

(map #{\a \e \i \o \u} (seq (char-array "Hello"))) => (nil \e nil nil \o)

3 个答案:

答案 0 :(得分:7)

filter identity (map f ... = (keep f ...

> (keep #{\a \e \i \o \u} (seq (char-array "Hello")))
(\e \o)

答案 1 :(得分:4)

过滤非零的

(filter (comp not nil?)
    (map #{\a \e \i \o \u} (seq (char-array "Hello")))
(\e \o) 

你可以通过gneral过滤这样的真实性:

 (filter #(if % true false) (map #{\a \e \i \o \u} "Hello"))
 (\e \o)   

值得注意的是,如果项目在集合中,集合实现了一个可调用的接口,返回true,因此您可以直接使用集合作为谓词进行过滤,因此对于您的初始示例,答案可以直接用过滤器表示(尽管这是一个不同的问题)

(filter #{\a \e \i \o \u} "Hello")
(\e \o)         

ps:字符串已经是序列,因此你并不需要(seq (char-array "Hello"))位,尽管它并没有真正受到伤害。

答案 2 :(得分:4)

我想这与counting only truthy values in a collection相同,因此请使用带有过滤器的identity函数:

(filter identity (map #{\a \e \i \o \u} (seq (char-array "Hello")))
相关问题