Функции высшего порядка в Clojure

Clojure великолепен, мы все это знаем, но дело не в этом. Мне интересно, каков идиоматический способ создания функций высшего порядка и управления ими в стиле Haskell. В Clojure я могу делать следующее:

(defn sum [a b] (+ a b))

Но (сумма 1) не возвращает функцию: это вызывает ошибку. Конечно, вы можете сделать что-то вроде этого:

(defn sum
  ([a] (partial + a)) 
  ([a b] (+ a b)))

В этом случае:

user=> (sum 1)
#<core$partial$fn__3678 clojure.core$partial$fn__3678@1acaf0ed>
user=> ((sum 1) 2)
3

Но это не похоже на правильный путь. Есть идеи?
Я не говорю о реализации функции sum , я говорю о более высоком уровне абстракции. Есть ли какие-то идиоматические шаблоны, которым нужно следовать? Какой-то макрос? Это лучший способ определения макроса или есть альтернативные решения?

36
задан rightfold 19 January 2014 в 18:51
поделиться