(max (count coll))
считает коллекцию, которая возвращает 3, а затем взятие max
из 3 (и ничего) приводит к 3. Это не то, что вы хотите.
(apply max count coll)
приводит к(max count "cat" "dog" "bear")
, который приводит к сравнению символа и строк с max
, и это вызывает исключение, потому что max
ожидает одно или несколько чисел.
(fn ["cat", "dog", "bear"])
не является допустимым синтаксисом и приводит к исключению, котороеfn
не соответствует спецификации.Специальная форма fn
принимает в качестве первого аргумента вектор символов (binding-form) (или, необязательно, имя и, в качестве третьего аргумента, связывающую форму)Например, (fn ident [n] n))
- это функция с именем идентификатора, которая принимает аргумент n
и возвращает n
, ((fn [n] n) 1) ;; => 1
.
Итак, принимая во внимание все это, одним из подходов является сначала определить количествоэлементов в coll
и затем нахождение max
этого колла.
(def coll ["cat" "dog" "bear"])
(или используйте набор #{"cat" "dog" "bear"}
, если вам не нужны дубликаты)
Вот несколько способов сделать это:
(apply max (map count coll)) ;; => 4
превратить коллекцию в коллекцию счетчиков [3 3 4]
и apply max
, чтобы получить (max 3 3 4)
.
(reduce max (map count coll)) ;; => 4
То же, что и вышено уменьшите сбор, взяв max
только первого элемента, затем второго элемента с max
предыдущего результата и т. д.
И в зависимости от того, что вам нужно, вы можете делать такие вещи, как:
(group-by count coll) ;; => {3 ["cat" "dog"], 4 ["bear"]}
(sort-by count ["a" "aa" "aaa" "aa" "aaaaa" "a"]) ;; => ("a" "a" "aa" "aa" "aaa" "aaaaa")