[英]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.