Haskell -返回一个包含n个列表的列表,这些列表计算字符串中每个字符的频率



我是Haskell的新手,我正在尝试解决一个小问题。

我想创建一个函数occurrences,定义如下:

occurrences:: Int -> String -> [[(Char, Int)]]

函数接受Int和String作为形参;其中Int表示要打印的出现列表的数量。每个字符出现的次数应按降序排序。

例如,occurrences 2 'hi'应该返回[[('h', 1), ('i', 1)], [('h', 1), ('i', 1)]],occurrences 3 'foo'将返回[[('o', 2), ('f', 1)], [('o', 2), ('f', 1)], [('o', 2), ('f', 1)]]

到目前为止,我已经在我的occurrences函数实现中添加了以下代码:
occurrences str = map (x -> [(head x, length x)]) $ group $ sort str

但这只是打印[[('h',1)],[('i',1)]]而不是[[('h', 1), ('i', 1)]],我不确定如何根据输入返回n列表数,因为我是Haskell的新手。

我能得到帮助吗?

您可以使用concat[[('h',1)],[('i',1)]]转换为[('h', 1), ('i', 1)]。一旦你这样做了,你会想要replicate它指定的次数。

效果很好。

import Data.List
import Data.Ord (comparing) 
occurrences n = replicate n . reverse . sortBy (comparing snd) . map (x -> (head x, length x)) . group . sort
main = print $ occurrences 3 "aabaccaccbbcc"

输出:

[[('c',6),('a',4),('b',3)],[('c',6),('a',4),('b',3)],[('c',6),('a',4),('b',3)]]

最新更新