簡體   English   中英

在Clojure函數中移動參數

[英]Move parameter in Clojure function

我正在研究4clojure問題29: “搞定問題

(= (__ "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范圍內的所有內容都將替換為空字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM