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