计算元素的出现次数

fre*_*low 22 dictionary haskell scala list-comprehension list

计算列表中的所有元素是Haskell中的一个单行:

count xs = toList (fromListWith (+) [(x, 1) | x <- xs])
Run Code Online (Sandbox Code Playgroud)

以下是一个示例用法:

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

这个函数在Scala中也可以如此优雅地表达吗?

mis*_*tor 38

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))
Run Code Online (Sandbox Code Playgroud)


Don*_*art 6

回想一下groupData.List库,

group :: [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)

给我们:

map (head &&& length) . group . sort
Run Code Online (Sandbox Code Playgroud)

一个列表友好且相对"天真"的实现.

  • 虽然这很酷,但问题是关于如何在*Scala*中实现这一点. (8认同)
  • 这个问题错误地认为使用中间容器和列表理解是Haskell中的一种优雅方法:) (5认同)
  • 哇,我不知道`&&&'运算符,非常酷! (4认同)