Вам не нужно, чтобы переместить параметр наружу, вы можете просто использовать ту же технику, вы использовали чтобы создать функцию фильтрации, то есть с 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
(«сочинить») и partial
переместить параметр, чтобы eta conversion (это техническое название для последней части манипуляций вы пытаетесь сделать) :
(comp (partial apply str)
(partial filter (fn [foo] (some #(= % foo)
(map char (range 65 91))))))
Это выражение теперь есть функция, которая принимает строку, фильтрует заглавные буквы, а затем преобразует его обратно в строку (замечает, что comp
применяет функцию справа налево).
(NB, что последнее выражение, вероятно, не очень идиоматические Clojure, первый метод, или один из предложений других, тем лучше.)
Спасибо Huon. Мне нужно было использовать подход ** comp **, чтобы получить мое решение в системе викторины 4clojure. Другие решения использовали ** применить str ** в регулярном выражении (** re-seq **), но это нормально - это усилено двумя концепциями - comp & re-seq. –
@SoniaHamilton, очень невежливо использовать чье-то настоящее имя, если они публикуют под псевдонимом (даже если их настоящее имя связано с этим псевдонимом!). Но приятно слышать :) – huon
Кроме того, @SoniaHamilton, вы * можете * использовать синтаксис анонимной функции с 'fn' на 4clojure.com:' (fn [x] (* 2 x)) '- это рабочее решение для [проблемы 15] (http://www.4clojure.com/problem/15). – huon