2010-05-12 14 views

Respuesta

51

Hay una función para hacer esto en clojure.core llamada comp. P.ej.

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

También puede ser que desee considerar el uso de ->/->>, por ejemplo,

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

Asegúrate de usar 'partial' cuando harías" currying "en Haskell. Así que para map/reduce, necesitarías hacer '(let [reducer (comp (partial reduce +) (partial map get-value))] (reducer my-things))' –

+1

También 'comp not' puede ser reemplazado con 'complemento':' ((complemento cero?) 5) ' – defhlt

4

Otra forma es (reduce #(%2 %1) n [zero? not]) pero me gusta (comp not zero?), ya mencionada por Michal, mejor.

12

Puede usar el acceso directo macro de Clojure para funciones anónimas para reescribir su versión con menos teclas.

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

Para el caso específico de componer not y otra función, puede utilizar complement.

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

Usando not en combinación con when y if es bastante común que if-not y when-not son funciones básicas.

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

El acceso directo lector-macro parece muy útil ya que el código es breve y legible. Tampoco sabía sobre "si-no" y "cuándo-no", ¡gracias! – StackedCrooked

+0

* macros centrales. 'if-not' y' when-not' son macros, por lo que no hay costo de tiempo de ejecución. – Carcigenicate

Cuestiones relacionadas