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

lqfhib0f  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(138)

我是新来的 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)]]
到目前为止,我已经添加了以下内容,作为occurrence函数实现的一部分。

occurrences str = map (\x -> [(head x, length x)]) $ group $ sort str

但这只是打印[[('h',1)],[('i',1)]]而不是[[('h', 1), ('i', 1)]],我不知道如何根据输入返回n的列表数,因为我是Haskell的新手。
我能得到帮助吗?

ars1skjm

ars1skjm1#

可以使用concat[[('h',1)],[('i',1)]]转换为[('h', 1), ('i', 1)]。完成后,您需要将replicate转换指定的次数。

col17t5w

col17t5w2#

效果很好。

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)]]

相关问题