让你尝尝
> (map (head &&& length) . group . sort) "asdfasdfaeadf"
[('a',4),('d',3),('e',1),('f',3),('s',2)]
一堆或进口后。
如果您不熟悉该语法,您可以轻松定义头 &&& 长度。
> head_and_length x = (head x, length x)
群可以递归地写
group [] = []
group (x:xs) = (x:ys) : group zs
where (ys,zs) = (takeWhile (==x) xs, dropWhile (==x) xs)
获取尽可能多的匹配元素,并递归地应用于剩余元素,直到没有剩余。请注意,此定义要求相同的元素是连续的,这就是需要排序的原因。
不建议编写一个复杂的函数,最好单独实现小功能(也许使用现有的功能),这些功能可以独立测试并创建这些功能的组合作为最终解决方案。