2014-03-27 2 views
4

Я только начинаю изучать Clojure (мой первый Lisp-подобный язык), поэтому я сожалею, если этот вопрос очень глупый.Применить несколько методов к списку Clojure?

Я хотел бы применить несколько методов в списке. До сих пор я придумал

(defn sqr [x] (* x x)) 
(def my-list '(4 7 9)) 
(map inc (map sqr (map dec my-list))) 
;= (10 37 65) 

Есть ли лучший (более сжатый/идиоматический) способ сделать это? В идеале я хотел бы сделать что-то вроде

(apply-multiple (dec sqr inc) my-list) 

... который бы также вернуться (10 37 65).

ответ

8

Просто используйте функцию состава:

(map (comp inc sqr dec) my-list) 

Или, если вы предпочитаете, чтобы записать их в обратном порядке (как в вашем примере):

(map #(-> % dec sqr inc) my-list) 
+0

Исходя из мира Java/Scala, то Форма «dec sqr inc» выглядела более «естественной», но я предполагаю, что «inc sqr dec» более идиоматичен для Lisp? – sigint

+2

@sigint Да, это обычный порядок составления функций, как в математических обозначениях (см. Http://en.wikipedia.org/wiki/Function_composition). Большинство функциональных языков, включая большинство лиз, придерживаются этого порядка. Некоторые языки (в частности, F #) дают вам выбор, предлагая два разных оператора. – rightfold

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