4

我正在处理4clojure问题 29:“获取 Caps”

(= (__ "HeLlO, WoRlD!") "HLOWRD")

我在 REPL 中写了一个解决方案:

user=> (apply str (filter (fn [foo] (some #(= % foo) 
         (map char (range 65 91)))) "AbC"))
"AC"

但正如您所见,我的参数“AbC”嵌套了两个括号。我如何将我的参数移到外部,以便在 4clojure 测试中使用它?我是否以错误的方式解决问题?

4

3 回答 3

5

您不需要将 a 参数移到外部,您可以使用与创建过滤函数相同的技术,即fn

(fn [string] 
  (apply str 
    (filter 
      (fn [foo] (some #(= % foo) (map char (range 65 91)))) 
      string)))

例如,以下两个语句是相同的:

(+ 1 2 3)
((fn [n] (+ 1 2 n)) 3)

但是,要实际回答您的问题,您可以使用comp("compose") 并partial移动参数以允许eta 转换(这是您尝试执行的操作的最后一部分的技术名称):

(comp (partial apply str)
      (partial filter (fn [foo] (some #(= % foo) 
                                       (map char (range 65 91))))))

这个表达式现在是一个函数,它接受一个字符串,过滤大写字母,然后将其转换回一个字符串(注意comp从右到左应用函数)。

(注意,最后一个表达式可能不是很惯用的 Clojure;第一种方法或其他人的建议更好。)

于 2012-04-28T11:39:19.090 回答
3

您应该传递一个函数作为解决方案。就像是:

(fn [text] 
    (apply str (filter (fn [foo] (some #(= % foo) 
                                        (map char (range 65 91)))) 
                       text)))

您也可以使用Character.isUpperCase过滤所有大写字符:(filter (fn [ch] (Character/isUpperCase ch) text)

于 2012-04-28T11:36:27.070 回答
2

我不熟悉 4Clojure,但如果允许,您可以使用clojure.string/replace.

以下应该可以解决问题:

(fn [s] (clojure.string/replace s #"[^A-Z]" ""))

不在 A 到 Z 范围内的所有内容都将替换为空字符串。

于 2012-04-28T11:39:43.900 回答