reduce
y apply
, por supuesto, solo son equivalentes (en términos del resultado final devuelto) para funciones asociativas que necesitan ver todos sus argumentos en el caso de aridad variable. Cuando son equivalentes en cuanto a resultados, diría que apply
siempre es perfectamente idiomático, mientras que reduce
es equivalente, y podría reducir una fracción de un abrir y cerrar de ojos, en muchos de los casos comunes. Lo que sigue es mi justificación para creer esto.
+
se implementa en términos de reduce
para el caso de aridad variable (más de 2 argumentos). De hecho, esto parece una forma "predeterminada" inmensamente sensata para cualquier función asociativa de aridad variable: reduce
tiene el potencial de realizar algunas optimizaciones para acelerar las cosas, tal vez a través de algo como internal-reduce
, una novedad 1.2 recientemente deshabilitada en master, pero es de esperar que se reintroduzca en el futuro, lo cual sería una tontería replicar en todas las funciones que podrían beneficiarse de ellas en el caso de vararg. En tales casos comunes, apply
solo agregará un poco de sobrecarga. (Tenga en cuenta que no hay nada de qué preocuparse realmente).
Por otro lado, una función compleja podría aprovechar algunas oportunidades de optimización que no son lo suficientemente generales como para ser incorporadas reduce
; entonces apply
te permitiría aprovecharlos, mientras reduce
que en realidad podría ralentizarte. Un buen ejemplo de este último escenario que ocurre en la práctica lo proporciona str
: utiliza StringBuilder
internamente y se beneficiará significativamente del uso de en apply
lugar de reduce
.
Entonces, yo diría usar apply
cuando tengas dudas; y si sabe que no le está comprando nada reduce
(y que es poco probable que esto cambie muy pronto), siéntase libre de usar reduce
para reducir esa diminuta sobrecarga innecesaria si lo desea.
sum
función incorporada como en Haskell? Parece una operación bastante común.