Может ли Clojure реализовать (g ∘ f) конструкции вроде Haskell g . f? В настоящее время я использую обходные пути, например (fn [n] (not (zero? n))), что не так приятно:)
Состав функции в Clojure?
Ответ 1
В clojure.core называется функция comp. Например.
((comp not zero?) 5)
; => true
Вы также можете рассмотреть возможность использования ->/->>, например.
(-> 5 zero? not)
; => true
Ответ 2
Вы можете использовать Clojure ярлык для чтения-макроса для анонимных функций, чтобы переписать вашу версию за меньшее количество нажатий клавиш.
user=> (#(not (zero? %)) 1)
true
Для конкретного случая составления not и другой функции вы можете использовать complement.
user=> ((complement zero?) 1)
true
Использование not в комбинации с when и if достаточно распространено, что if-not и when-not являются основными функциями.
user=> (if-not (zero? 1) :nonzero :zero)
:nonzero
Ответ 3
Другим способом является (reduce #(%2 %1) n [zero? not]), но мне нравится (comp not zero?), уже упомянутый Михалом, лучше.