2014-10-20 50 views
-1

http://www.braveclojure.com/functional-programming/開始,以下代碼將修剪空白並用「LOL」替換「lol」。Clojure:如何在減少功能時傳遞參數

(require '[clojure.string :as s]) 
(defn clean 
    [text] 
    (s/replace (s/trim text) #"lol" "LOL")) 

(clean "My boa constrictor is so sassy lol! ") 
; => "My boa constrictor is so sassy LOL!" 

現在,根據網站下面的代碼減少功能相當於我們上面的代碼。

(defn clean 
     [text] 
     (reduce (fn [string string-fn] (string-fn string)) 
       [s/trim #(s/replace % #"lol" "LOL")])) 

問題:我不明白是怎麼text參數得到傳遞到匿名函數中減少功能。我如何編寫一個類似的代碼,明確地將參數text傳遞給reduce函數中的匿名函數?

+0

這似乎是不正確的。 – ntalbs 2014-10-20 01:00:17

+0

@ntalbs如果'text'是函數向量之前的arg,它就會工作。 – noisesmith 2014-10-20 01:02:03

+0

我給了這個問題更多的描述。請不要低估。 @noisesmith我試着在函數向量之前添加'text'。它沒有工作 – mynameisJEFF 2014-10-20 01:04:23

回答

0

reduce函數採用可選參數,即減少的初始值。如果沒有提供,則使用最後一個arg的第一項代替(在這種情況下當然不起作用,但當您有一系列與初始值具有相同有效類型的輸入時會起作用)。

user> (defn clean 
     [text] 
     (reduce (fn [string string-fn] (string-fn string)) 
       text 
       [clojure.string/trim #(clojure.string/replace % #"lol" "LOL")])) 
#'user/clean 
user> (clean "My boa constrictor is so sassy lol! ") 
"My boa constrictor is so sassy LOL!"