我需要使用group函数,但我想设置单个组中元素数量的最大限制,如果达到限制,该函数应该添加另一个列表,其中包含剩余元素在第一个旁边。 换句话说,我想实现另一个版本的 group ,它做了类似的事情:
groupWithLimit "abbcccddeeee" 2
=
["a","bb","cc","c","dd","ee","ee"]
这些应该是类型和定义
groupWithLimit :: [a]-> Int -> [[a]]
groupWithLimit (x:xs) limit = ...
我尝试使用map和lambda表达式,但我没有设法做到这一点......
提前谢谢!
答案 0 :(得分:4)
您可以先对列表中的元素进行分组,然后拆分所有子列表并连接结果:
groupWithLimit :: Eq a => Int -> [a] -> [[a]]
groupWithLimit n xs = concatMap (chunksOf n) (group xs)
E.g。 chunksOf 2 "aaaaa"
是["aa","aa","a"]
。您可以找到chunksOf
here或自行实施。
答案 1 :(得分:1)
关于Haskell的一个很酷的事情是,大多数软件包都是开源的。如果你继续使用Hackage,你可以查找每个功能的来源(点击" Source"在右边)。
因此,让我们看看group
是defined:
group :: Eq a => [a] -> [[a]]
group = groupBy (==)
全部,对,我们需要groupBy
:
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy _ [] = []
groupBy eq (x:xs) = (x:ys) : groupBy eq zs
where (ys,zs) = span (eq x) xs
接下来,span
:
span _ xs@[] = (xs, xs)
span p xs@(x:xs')
| p x = let (ys,zs) = span p xs' in (x:ys,zs)
| otherwise = ([],xs)
现在,添加span
的限制并且在修改后的groupBy
中使用此新版本不应该太难。