(= (__ "HeLlO, WoRlD!") "HLOWRD")
我在 REPL 中写了一个解决方案:
user=> (apply str (filter (fn [foo] (some #(= % foo)
(map char (range 65 91)))) "AbC"))
"AC"
但正如您所见,我的参数“AbC”嵌套了两个括号。我如何将我的参数移到外部,以便在 4clojure 测试中使用它?我是否以错误的方式解决问题?
您不需要将 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;第一种方法或其他人的建议更好。)
您应该传递一个函数作为解决方案。就像是:
(fn [text]
(apply str (filter (fn [foo] (some #(= % foo)
(map char (range 65 91))))
text)))
您也可以使用Character.isUpperCase过滤所有大写字符:(filter (fn [ch] (Character/isUpperCase ch) text)
我不熟悉 4Clojure,但如果允许,您可以使用clojure.string/replace
.
以下应该可以解决问题:
(fn [s] (clojure.string/replace s #"[^A-Z]" ""))
不在 A 到 Z 范围内的所有内容都将替换为空字符串。