如何在Haskell中找到字符串中的字符的频率?

我如何计算一个字符串中的字符的频率,然后输出它们的表格?

例如,如果我输入单词“happy”,结果将是

h 1  
a 1  
p 2  
y 1  

如果这可以按照ASCII顺序排列,那将是辉煌的。

我知道我需要使用计数功能,任何其他提示都不会被赞赏。

编辑:所有的答案都是辉煌的,只有我在哈斯克尔这样的初学者,我实际上并不了解他们在做什么。

最简单的解决方案是使用Data.Map存储从字符到频率的中间映射。然后,您可以使用fromListWith轻松构建计数。由于Data.Map被排序,您可以以ASCII顺序免费获取它们。

λ> :m + Data.Map
λ> let input = "happy"
λ> toList $ fromListWith (+) [(c, 1) | c <- input]
[('a',1),('h',1),('p',2),('y',1)]

那么这里发生了什么?

这个想法是使用字符作为键和频率作为值来构建Data.Map(树图)。

首先,我们采用输入字符串,并使用1表示每个字符的元组,以表示一次。

λ> [(c, 1) | c <- input]
[('h',1),('a',1),('p',1),('p',1),('y',1)]

接下来,我们使用fromListWith通过将每个键值对重复插入到地图中,从这些键值对中构建排序的映射。我们还给它一个函数,当一个键已经在地图中时,它将被使用。在我们的例子中,我们使用()使得当一个字符被多次看到时,我们将计数加到现有的和。

最后,我们使用toList将地图转换成一个键值元组列表。

http://stackoverflow.com/questions/7108559/how-to-find-the-frequency-of-characters-in-a-string-in-haskell

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何在Haskell中找到字符串中的字符的频率?