Haskell-设置“组”函数的限制

Haskell-设置“组”函数的限制,haskell,Haskell,我需要使用该函数,但我想对单个组中的元素数量设置一个最大限制,如果达到该限制,该函数应该在第一个列表的旁边添加另一个列表,其中剩余的元素就在第一个列表的旁边。 换句话说,我想实现另一个版本的group,它可以做这样的事情: groupWithLimit "abbcccddeeee" 2 = ["a","bb","cc","c","dd","ee","ee"] 这些应该是类型和定义 groupWithLimit :: [a]-> Int -> [[a]] groupWithLimi

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

groupWithLimit "abbcccddeeee" 2 
=
["a","bb","cc","c","dd","ee","ee"]
这些应该是类型和定义

groupWithLimit :: [a]-> Int -> [[a]]
groupWithLimit (x:xs) limit = ...
我试着用map和lambda表达式,但没有成功


提前谢谢你

Haskell最酷的一点是,大多数软件包都是开源的。如果你进行黑客攻击,你可以查找每个函数的源代码,点击右边的源代码

让我们来看看团队是如何运作的:

好的,我们需要groupBy:

接下来,span:


现在,在修改过的groupBy中添加一个范围限制并使用这个新版本应该不会太难。

Haskell最酷的地方是,大多数软件包都是开源的。如果你进行黑客攻击,你可以查找每个函数的源代码,点击右边的源代码

让我们来看看团队是如何运作的:

好的,我们需要groupBy:

接下来,span:


现在,在修改后的groupBy中添加一个范围和使用此新版本的限制应该不会太难。

您可以首先对列表的元素进行分组,然后拆分所有子列表并对结果进行处理:

groupWithLimit :: Eq a => Int -> [a] -> [[a]]
groupWithLimit n xs = concatMap (chunksOf n) (group xs)

例如,块2 aaaaa是[aa,aa,a]。您可以找到chunksOf或自己实现它。

您可以首先对列表中的元素进行分组,然后拆分所有子列表并对结果进行排序:

groupWithLimit :: Eq a => Int -> [a] -> [[a]]
groupWithLimit n xs = concatMap (chunksOf n) (group xs)

例如,块2 aaaaa是[aa,aa,a]。您可以找到chunksOf或自己实现它。

编辑您的问题并添加您迄今为止在实现方面的最佳尝试。编辑您的问题并添加您迄今为止在实现方面的最佳尝试。我投了反对票,因为这个答案使问题更加复杂。假定读者对groupBy和span的含义进行反向工程,然后决定如何破解现有代码。这看起来像是一个谜题,而不是一个提示。@user3237465:实际上,它向您展示了如何检查、理解和修改有关Hackage的现有代码,在我看来,这比仅仅说这是您的家庭作业更有价值。我自己也做过很多次。好吧,你展示了关于黑客的东西,但你没有提供一个真正的答案。我投了反对票,因为这个答案让问题变得更复杂。假定读者对groupBy和span的含义进行反向工程,然后决定如何破解现有代码。这看起来像是一个谜题,而不是一个提示。@user3237465:实际上,它向您展示了如何检查、理解和修改有关Hackage的现有代码,在我看来,这比仅仅说这是您的家庭作业更有价值。我自己也做过很多次。好吧,你在hackage上展示了这些东西,但你没有提供真正的答案。谢谢你的提示。但我认为他需要通过concat将最终结果平复。好的,好的。但对于初学者来说,我认为>>=是一个monad操作符。你为什么在这里使用它而不是concat?这是一种快速破解吗?@vikingsteve,对我来说更好看。我修改了代码,使其更加明确。哇,你同时向我介绍了concatMap。太棒了-谢谢你!你的答案很清楚,并提出了一个简单的解决方案,太棒了!但是我如何自己实现chunksOf呢?谢谢chunksOf的提示。但我认为他需要通过concat将最终结果平复。好的,好的。但对于初学者来说,我认为>>=是一个monad操作符。你为什么在这里使用它而不是concat?这是一种快速破解吗?@vikingsteve,对我来说更好看。我修改了代码,使其更加明确。哇,你同时向我介绍了concatMap。太棒了-谢谢你!你的答案很清楚,并提出了一个简单的解决方案,太棒了!但是我如何自己实现chunksOf呢?
span _ xs@[]            =  (xs, xs)
span p xs@(x:xs')
         | p x          =  let (ys,zs) = span p xs' in (x:ys,zs)
         | otherwise    =  ([],xs)
groupWithLimit :: Eq a => Int -> [a] -> [[a]]
groupWithLimit n xs = concatMap (chunksOf n) (group xs)