Может ли 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?)
, уже упомянутый Михалом, лучше.