Композиция функции в Clojure? - PullRequest
35 голосов
/ 12 мая 2010

Может ли Clojure реализовать (g ∘ f) конструкции, подобные g . f на Haskell? В настоящее время я использую обходные пути, такие как (fn [n] (not (zero? n))), что не так приятно:)

Ответы [ 3 ]

54 голосов
/ 12 мая 2010

В clojure.core есть функция, которая называется comp. Э.Г.

((comp not zero?) 5)
; => true

Вы также можете рассмотреть возможность использования -> / ->>, например,

(-> 5 zero? not)
; => true
13 голосов
/ 13 мая 2010

Вы можете использовать ярлык-макрос 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
4 голосов
/ 12 мая 2010

Другой способ - (reduce #(%2 %1) n [zero? not]), но мне нравится (comp not zero?), уже упомянутый Михалом, лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...