35 votes

Composition de fonctions en Clojure ?

Clojure peut-il implémenter des constructions (g f) comme celle de Haskell ? g . f ? J'utilise actuellement des solutions de contournement comme (fn [n] (not (zero? n))) ce qui est loin d'être aussi agréable :)

54voto

Michał Marczyk Points 54179

Il y a une fonction pour faire cela dans clojure.core appelé comp . Par exemple

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

Vous pouvez également envisager d'utiliser -> / ->> par exemple

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

13voto

Brian Carper Points 40078

Vous pouvez utiliser le raccourci reader-macro de Clojure pour les fonctions anonymes afin de réécrire votre version en moins de frappes.

user=> (#(not (zero? %)) 1)
true

Pour le cas spécifique de la composition not et une autre fonction, vous pouvez utiliser complement .

user=> ((complement zero?) 1)
true

Utilisation de not en combinaison avec when y if est suffisamment courante pour que if-not y when-not sont des fonctions essentielles.

user=> (if-not (zero? 1) :nonzero :zero)
:nonzero

4voto

Michiel Borkent Points 11503

Un autre moyen est (reduce #(%2 %1) n [zero? not]) mais j'aime (comp not zero?) déjà mentionné par Michal, mieux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X