Filter Clojure中的筛选器类型字符串

Filter Clojure中的筛选器类型字符串,filter,clojure,Filter,Clojure,目前我正在尝试学习Clojure,我想编写一个参数数量可变的函数。这个函数应该过滤每个输入,以检查它是否是字符串。如果是,则应返回字符串类型的每个输入 Clojure对我来说很难,思维方式也不一样,但我在这里的方向正确吗。。我似乎无法解决这个问题: (defn returnString [& y] (if (next y) (filter (fn [x] (= (type x) "java.lang.String"))y) (recur (next x)))) 谢谢 有一个名为stri

目前我正在尝试学习Clojure,我想编写一个参数数量可变的函数。这个函数应该过滤每个输入,以检查它是否是字符串。如果是,则应返回字符串类型的每个输入

Clojure对我来说很难,思维方式也不一样,但我在这里的方向正确吗。。我似乎无法解决这个问题:

(defn returnString [& y]
(if (next y)
(filter (fn [x] (= (type x) "java.lang.String"))y)
(recur (next x))))

谢谢

有一个名为
string?
的函数,如果参数是字符串,则返回true;如果参数不是字符串,则返回false

=> (string? "hi")
true
=> (string? 100)
false
=> (string? ["a" "b" "c"])
false
考虑到这一点,您的函数将如下所示:

(defn return-strings [& vals]
  (filter string? vals))
filter函数将返回一个值序列(本质上是一个集合),因此在这种情况下,在自定义函数中不必担心递归(即使用
recur


您用来确定什么是字符串的匿名函数非常接近正确。如果通过在REPL中输入
(source string?
)查看
字符串的源代码,您将看到:

(fn [x] (instance? String x))
尽管如此,您正在采取的方法也会起作用。您只需要指定String类,而不是指定您给定的String值。(注意,您可以关闭
java.lang
,因为该包会像java中一样自动包含。)

(fn [x] (= (type x) String))