[英]Move parameter in Clojure function
您不需要将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范围内的所有内容都将替换为空字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.