Я собираюсь сыграть адвоката дьявола и спорить за apply
.
reduce
- это взятие clojure fold
(точнее foldl
), левой складки, и обычно определяется начальным элементом, потому что операция складывания состоит из двух частей:
так, чтобы найти сумму набора чисел, естественный способ использования +
- это (fold + 0 values)
или, в ближайшем будущем, (reduce + 0 values)
.
это явно показывает результат для пустого списка, что важно, потому что для меня не очевидно, что +
возвращает 0
в этом случае - в конце концов, +
- это бинарный оператор (все, что fold
необходимо или предполагается).
теперь, на практике, получается, что +
у clojure определяется как больше , чем бинарный оператор. это займет много или даже нулевые значения. прохладно. но если мы используем эту «дополнительную» информацию, можно сообщить об этом читателю. (apply + values)
делает это - он говорит: «Я использую + странным образом, как больше, чем бинарный оператор». и это помогает людям (по крайней мере мне) понять код.
[интересно спросить, почему apply
кажется более понятным. и я думаю, что это отчасти то, что вы говорите читателю: «смотри, +
был спроектирован так, чтобы принимать несколько значений (вот для чего применяется apply), и поэтому реализация языка будет включать в себя случай нулевых значений». этот неявный аргумент отсутствует при reduce
, примененном к одному списку.]
альтернативно, (reduce + 0 values)
тоже хорошо. но (reduce + values)
вызывает во мне инстинктивную реакцию: «да, +
дает ноль?».
и если вы не согласны, то, пожалуйста, перед тем, как понизить голос или опубликовать ответ, вы уверены о том, что (reduce * values)
вернет пустой список?