2012-04-28 2 views
4

Я работаю над 4clojure проблемами 29: "Get the Caps"параметра Переместить в функции Clojure

(= (__ "HeLlO, WoRlD!") "HLOWRD") 

я написал решение в РЕПЛ:

user=> (apply str (filter (fn [foo] (some #(= % foo) 
     (map char (range 65 91)))) "AbC")) 
"AC" 

Но как вы можете видеть мой параметр " AbC "вложен в два скобки. Как бы я переместил мой параметр на внешний, чтобы я мог использовать его в тесте 4clojure? Я подошел к проблеме не так?

ответ

5

Вам не нужно, чтобы переместить параметр наружу, вы можете просто использовать ту же технику, вы использовали чтобы создать функцию фильтрации, то есть с 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, первый метод, или один из предложений других, тем лучше.)

+0

Спасибо Huon. Мне нужно было использовать подход ** comp **, чтобы получить мое решение в системе викторины 4clojure. Другие решения использовали ** применить str ** в регулярном выражении (** re-seq **), но это нормально - это усилено двумя концепциями - comp & re-seq. –

+0

@SoniaHamilton, очень невежливо использовать чье-то настоящее имя, если они публикуют под псевдонимом (даже если их настоящее имя связано с этим псевдонимом!). Но приятно слышать :) – huon

+0

Кроме того, @SoniaHamilton, вы * можете * использовать синтаксис анонимной функции с 'fn' на 4clojure.com:' (fn [x] (* 2 x)) '- это рабочее решение для [проблемы 15] (http://www.4clojure.com/problem/15). – huon

3

Вы должны передать функцию в качестве решения. Что-то вроде:

(fn [text] 
    (apply str (filter (fn [foo] (some #(= % foo) 
             (map char (range 65 91)))) 
         text))) 

Также вы можете использовать Character.isUpperCase для фильтрации всех символов в верхнем регистре: (filter (fn [ch] (Character/isUpperCase ch) text)

+0

Спасибо Nikita. ** Решение dbaupp ** было более полезным - в викторине 4clojure текст находится вне любых скобок, поэтому включение его в fn не работает ... –

+1

@SoniaHamilton Это действительно работает. Я решил ту же задачу с 'fn':' (fn [text] (применить str (фильтр # (символ/isUpperCase%) текст))) ' –

2

Я не знаком с 4Clojure, но если это разрешено , вы можете использовать clojure.string/replace.

Следующая следует сделать трюк:

(fn [s] (clojure.string/replace s #"[^A-Z]" "")) 

Все, что не находится в диапазоне от A до Z заменяется на пустую строку.

Смежные вопросы