agrupa :: String -> [(Char,Int)]
agrupa [ ] = [ ]
agrupa (x:xs) = let (l1, l2) = span' (==x) xs
in (x, (length l1) + 1) : agrupa l2
span' :: (a->Bool) -> [a] -> ([a],[a])
span' p l = (takeWhile p l, dropWhile p l)
这个函数得到一个字符串,并告诉我们每个字符有多少?
我的问题与1
中的(length l1) + 1
有关,为什么我们需要它?
如果你用不同的例子解释它,我真的很感激,因为这样的情况(比如+ 1)我在扫描中已经看过很多次(或者只调试agrope部分)这个功能看看它是如何工作的?
感谢您的时间
答案 0 :(得分:6)
+ 1
之所以存在,是因为您之前已将[{1}}个元素之一与== x
本身匹配,格式为x
。如果您没有考虑到这一点,那么没有重复的列表会在结果中的每个元组的(x:xs)
中给出所有0
个;如你所知,snd
总是给出连续元素的实际数量。