9

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

Clojure 对我来说很难,而且思维方式不同,但我在这里的方向是否正确.. 我似乎无法解决它:

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

谢谢!

4

1 回答 1

11

有一个函数调用string?,如果参数是字符串则返回 true,否则返回 false。

=> (string? "hi")
true
=> (string? 100)
false
=> (string? ["a" "b" "c"])
false

因此,考虑到这一点,您的函数将如下所示:

(defn return-strings [& vals]
  (filter string? vals))

filter 函数将返回一个值序列(本质上是一个集合),因此在这种情况下,您无需担心自定义函数中的递归(即使用recur)。


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

(fn [x] (instance? String x))

虽然,您采用的方法也可以。您只需要指定 String 类而不是您提供的字符串值。(请注意,您可以省略,java.lang因为该包会像在 Java 中一样自动包含在内。)

(fn [x] (= (type x) String))
于 2012-05-13T00:36:32.020 回答