reducey 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 applysiempre es perfectamente idiomático, mientras que reducees 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 reducepara 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: reducetiene 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, applysolo 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 applyte permitiría aprovecharlos, mientras reduceque en realidad podría ralentizarte. Un buen ejemplo de este último escenario que ocurre en la práctica lo proporciona str: utiliza StringBuilderinternamente y se beneficiará significativamente del uso de en applylugar de reduce.
Entonces, yo diría usar applycuando 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 reducepara reducir esa diminuta sobrecarga innecesaria si lo desea.
sumfunción incorporada como en Haskell? Parece una operación bastante común.