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
, я говорю о более высоком уровне абстракции. Есть ли какие-то идиоматические шаблоны, которым нужно следовать? Какой-то макрос? Это лучший способ определения макроса или есть альтернативные решения?