voy a jugar al abogado del diablo y abogar por apply
.
reduce
es tomar de clojure en fold
(más exactamente foldl
), la izquierda veces, y se define generalmente con un elemento inicial, porque una operación de pliegue tiene dos partes:
manera de encontrar la suma de tan de números, la forma natural de usar +
es como (fold + 0 values)
o, en clojure, (reduce + 0 values)
.
esta muestra de manera explícita el resultado de una lista vacía, lo cual es importante porque no es obvio para mí que +
vuelve 0
en este caso - después de todo, +
es un operador binario (todo lo que fold
necesidades o asumido) .
ahora, en la práctica, resulta que +
de clojure se define como más que un operador binario. tomará muchos o incluso valores cero. guay. pero si estamos usando esta información "adicional", es amistoso señalar eso al lector. (apply + values)
hace esto - dice "estoy usando + de una manera extraña, como más que un operador binario". y eso ayuda a las personas (yo, al menos) a entender el código.
[es interesante preguntar por qué apply
se siente más claro. y creo que es en parte por lo que le está diciendo al lector: "mira, +
fue diseñado para aceptar valores múltiples (para eso se usa la aplicación), por lo que la implementación del lenguaje incluirá el caso de valores cero". ese argumento implícito no está presente con reduce
aplicado a una sola lista.]
alternativamente, (reduce + 0 values)
también está bien. pero (reduce + values)
desencadena una reacción instintiva en mí: "¿eh, +
proporciona un cero?".
y si no está de acuerdo, por favor, antes de Downvote o una respuesta, ¿estás seguro de (reduce * values)
sobre lo volverá a una lista vacía?
posible duplicado de [Clojure: reducir vs. aplicar] (http://stackoverflow.com/questions/3153396/clojure-reduce-vs-apply). La pregunta vinculada es más nueva que esta, pero tiene mejores respuestas de la OMI, por lo que la nomino como superviviente. – amalloy