Вопрос по haskell, scala, list-comprehension, list, dictionary – рассчитывать вхождения элементов [дубликаты]

22

This question already has an answer here:

Scala how can I count the number of occurrences in a list 14 answers

Подсчет всех элементов в списке в Хаскеле - это одна строка:

count xs = toList (fromListWith (+) [(x, 1) | x <- xs])

Вот пример использования:

*Main> count "haskell scala"
[(' ',1),('a',3),('c',1),('e',1),('h',1),('k',1),('l',3),('s',2)]

Можно ли так элегантно выразить эту функцию в Scala?

Не H2010, но IMO довольно стандартно. sdcvvc
@sdcvvc Являются ли разделы кортежей стандартным Haskell? fredoverflow
Бессмысленная версия:toList . fromListWith (+) . map (,1). sdcvvc
@sdcvvc Где я могу найти этот «довольно стандартный»? ;) fredoverflow

Ваш Ответ

4   ответа
1

def count[A](xs: Seq[A]): Seq[(A, Int)] = xs.distinct.map(x => (x, xs.count(_ == x)))
6

Отзывgroup из библиотеки Data.List,

group :: [a] -> [[a]]

давая нам:

map (head &&& length) . group . sort

дружественный к списку и относительно "наивный" реализация.

Хотя это круто, вопрос был о том, как можно реализовать это вScala.
Ого, я не знал о&&& оператор, довольно круто!
Вопрос был ошибочным, когда я подумал, что использование промежуточного контейнера и понимание списка было элегантным подходом в Haskell :)
@FredOverflow Они имеют одинаковую сложность.
Как ваше решение сравнивается с моим с точки зрения сложности времени? fredoverflow
0

// Implementing this one in Scala
def fromSeqWith[A, B](s: Seq[(A, B)])(f: (B, B) => B) =
    s groupBy (_._1) mapValues (_ map (_._2) reduceLeft f)

def count[A](xs: Seq[A]) = fromSeqWith(xs map (_ -> 1))(_+_).toSeq

Скала & APOS; sgroupBy делает это более сложным, чем это должно быть - были призывы кgroupWith или жеgroupInto, но они не сделали Odersky стандартным для включения в стандартную библиотеку.

36
scala> "haskell scala".groupBy(identity).mapValues(_.size).toSeq
res1: Seq[(Char, Int)] = ArrayBuffer((e,1), (s,2), (a,3), ( ,1), (l,3), (c,1), (h,1), (k,1))
Это странное определение короче;) Но, по крайней мере, это еще и один;)
@ Николас, у меня не было.toSeq в конце, когда я написал это. ;) Убрал это сейчас.

Похожие вопросы