Haskell - 为"组设置限制"功能

时间:2015-12-08 11:31:26

标签: haskell

我需要使用group函数,但我想设置单个组中元素数量的最大限制,如果达到限制,该函数应该添加另一个列表,其中包含剩余元素在第一个旁边。 换句话说,我想实现另一个版本的 group ,它做了类似的事情:

groupWithLimit "abbcccddeeee" 2 
=
["a","bb","cc","c","dd","ee","ee"]

这些应该是类型和定义

groupWithLimit :: [a]-> Int -> [[a]]
groupWithLimit (x:xs) limit = ...

我尝试使用map和lambda表达式,但我没有设法做到这一点......

提前谢谢!

2 个答案:

答案 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"在右边)。

因此,让我们看看groupdefined

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中使用此新版本不应该太难。