2014-10-20 2 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 в анонимную функцию внутри функции уменьшения?

+0

Это кажется неправильным. – ntalbs

+0

@ntalbs это сработает, если 'text' был arg до вектора funtions. – noisesmith

+0

Я дал несколько описаний на вопрос. Пожалуйста, не спускайте вниз. @noisesmith Я попробовал добавить текст перед вектором функций. Это не сработало – mynameisJEFF

ответ

0

Функция reduce принимает необязательный аргумент, начальное значение уменьшения. Если он не указан, вместо него используется первый элемент последнего аргумента (который, конечно, не будет работать вообще в этом случае, но работает, если у вас есть последовательность входов, которые имеют тот же эффективный тип, что и начальное значение).

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!" 
Смежные вопросы