Который лучше?: (уменьшите + …), или (применяются + …)?

Просто дополнение, вы можете позвонить Nullable.GetValueOrDefault()

Пример:

if (dateTime1.GetValueOrDefault() < dateTime2)
  ...
13
задан unj2 3 August 2009 в 00:35
поделиться

4 ответа

Если вы спрашиваете с точки зрения производительности, reduce немного лучше:

(time (dotimes [_ 1e6] (apply + (filter even? (range 1 20)))))
"Elapsed time: 9059.251 msecs"
nil

(time (dotimes [_ 1e6] (reduce + (filter even? (range 1 20)))))
"Elapsed time: 8420.323 msecs"
nil

В этом случае разница примерно 7%, но YMMV в зависимости от машины .

Вы не предоставили исходный код для функции prime? , поэтому я заменил даже? в качестве предиката. Имейте в виду, что в вашей среде выполнения может доминировать prime? , и в этом случае выбор между reduce и apply имеет еще меньшее значение.

Если вы являетесь спрашивая, какая из них более «шепчуща», я бы сказал, что реализация reduce предпочтительнее, так как то, что вы делаете, это сокращение / сворачивание в смысле функционального программирования.

18
ответ дан 1 December 2019 в 17:36
поделиться

Я ожидал, что это применимо для реализации ленивого списка, который может быть уродливым, и вы никогда не захотите предполагать, что ваш список не ленивый, потому что вы можете внезапно столкнуться с огромным использованием памяти.

Reduce собирает их по одному и объединяет результаты в одно целое, никогда не беря весь список сразу.

7
ответ дан 1 December 2019 в 17:36
поделиться

Я бы подумал, что reduce будет предпочтительнее, если он доступен, потому что apply использует список в качестве аргументов функции, но когда у вас есть большое количество - скажем, миллион - элементов в списке, вы создадите вызов функции с миллионом аргументов! Это может вызвать некоторые проблемы с некоторыми реализациями Lisp.

13
ответ дан 1 December 2019 в 17:36
поделиться

(уменьшить op ...) является нормой и (apply op ...) исключением (особенно для str и concat).

8
ответ дан 1 December 2019 в 17:36
поделиться