По моему мнению, отображение какой-либо функции над коллекцией, а затем немедленное сжатие списка до одного элемента - признак использования reduce
.
(defn tally-map [coll]
(reduce (fn [h n]
(assoc h n (inc (h n 0))))
{} coll))
В этом случае я бы написал mode
fn, чтобы взять в качестве аргумента одну коллекцию, как вы и сделали. Единственная причина, по которой я могу использовать несколько аргументов для такой функции, заключается в том, что вы планируете много печатать буквальные аргументы.
Так, например, если это для интерактивного сценария REPL, и вы часто будете буквально печатать (mode [1 2 1 2 3])
, тогда у вас должна быть функция, принимающая несколько аргументов, чтобы вы не набирали дополнительный []
в вызове функции все время. Если вы планируете читать множество чисел из файла, а затем использовать режим этих чисел, тогда пусть функция принимает единственный аргумент, который является коллекцией, чтобы вы могли избежать использования apply
все время. Я предполагаю, что ваш самый распространенный вариант использования - последний. Я считаю, что apply
также добавляет издержки, которых вы избегаете, когда у вас есть вызов функции, который принимает аргумент коллекции.
Я согласен с другими, что вы должны mode
вернуть список результатов, даже если он только один; это сделает вашу жизнь проще. Может быть, переименуйте его modes
, пока вы там.