2013-06-23 13 views
5

我想寫一個函數,需要一個字符串並返回過濾器函數的結果(我正在通過4clojure問題)。結果也必須是一個字符串。Clojure加入無法從過濾器函數的結果創建字符串

我寫這樣的:

(fn my-caps [s] 
    (filter #(Character/isUpperCase %) s)) 

(my-caps "HeLlO, WoRlD!") 

Result: (\H \L \O \W \R \D) 

現在我試圖創建一個字符串出這份名單的,使用clojure.string /加盟,像這樣:

(fn my-caps [s] 
    (clojure.string/join (filter #(Character/isUpperCase %) s))) 

結果然而是相同的。我也試過使用apply str,但沒有成功。

回答

3

試試這個:

(defn my-caps [s] 
    (->> (filter #(Character/isUpperCase %) s) 
     (apply str))) 

filter函數返回一個懶惰的序列。如果您想獲得string,則應通過應用str函數將序列轉換爲字符串。

+0

謝謝!它使我查找雙箭頭線程宏。我以前不知道線程宏。 –

+0

@ntalbs,爲什麼在這裏使用' - >>'運算符?一個簡單的函數調用就足以調用'apply' –

+2

@ÓscarLópez是的,你是對的。結果是一樣的。但是,使用' - >>'可以更輕鬆地閱讀代碼閱讀,並按照我的思維過程輸入。而已。這是一種個人喜好。 – ntalbs

4

您必須通過應用str函數將由filter返回的惰性序列轉換爲字符串。此外,使用defn定義一個新的功能 - 這裏是如何:它

​​

按預期工作:

(my-caps "HeLlO, WoRlD!") 
=> "HLOWRD" 
4

最後的代碼段,你粘貼工作正常。 join確實會返回一個字符串。

+0

你說得對。直到現在我已經重新加載文件到REPL,但只有在我真的重新啓動它的工作。線程不是浪費 - 我學習了從集合中創建字符串的新方法。 –