2013-11-21 51 views
0
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) 

这个函数得到一个字符串,并给出了每个字符有多少个字符?长度l1 +1 =>什么是一个?

我的问题是关于1(length l1) + 1为什么我们需要它? 我真的很感激,如果你用不同的例子解释它,因为这种情况(如+ 1)我也见过很多次扫描(或只调试agrope部分)函数看看它是如何工作的?

感谢您的时间

+2

为什么你定义'span'而不是使用['Data.List.span'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#五:跨度)? – leftaroundabout

回答

6

+ 1是因为有您以前匹配== x元素之一了,即x本身,在模式(x:xs)。如果你没有考虑到这个问题,那么一个没有重复的列表会给出结果中每个元组的snd中的所有0;正如你所知道的那样,snd总是给出连续元素的实际数量。

+0

然后当我们使用的时候,让我们假设如果x ==最大(x:xs),那么 – user2999428

+1

通常,将_put in_'x:xs'作为函数的参数没有什么好的理由。你要么解构一个列表(在你的情况下,用'agrupa(x:xs)= ...',或者另一个列表,在这种情况下,你首先需要计算新的头部和尾部。当然,你也可以编写'agrupa(x:xs)= y:ys'',其中{y =(x,length l1 + 1); ys = agrupa ls; ...}'这只是对你实现的简单重构。 – leftaroundabout

相关问题