gpt4 book ai didi

haskell - `group list by size` 是折叠吗?

转载 作者:行者123 更新时间:2023-12-03 14:50:30 27 4
gpt4 key购买 nike

我遇到了这个问题:按相同大小的数据包对列表的元素进行分组,这样

> groupBy 3 [1..10] 
[[1,2,3], [4,5,6], [7,8,9], [10]]

没什么很难做的,但首先我很惊讶我找不到它的功能。
我的第一次尝试是
 groupBy _ [] = []
groupBy n xs = g : groupBy n gs
where (g, gs) = splitAt n xs

到目前为止一切顺利,即使在无限列表上也可以。但是我不喜欢第一行 groupBy _ [] = [] .似乎是弃牌的好人选,但我想不通。

那么这个函数可以写成 fold 还是 one liner 呢?

更新

我在一个类轮上的尝试:
groupBy' n l = map (map snd) $ groupBy ((==) `on` fst) $ concatMap (replicate n) [1..] `zip` l

我花了 10 倍的时间才写出最初的尝试。

更新 2

按照 Ganesh 的回答并使用 unfoldrpointfree 的帮助我提出了这个令人费解的无点解决方案
groupBy' n = unfoldr $ listToMaybe . (ap (>>) (return.splitAt n))

最佳答案

您可以通过一些体操将其作为折叠来进行,但作为 unfold 更好。 :

 unfoldr (\xs -> if null xs then Nothing else Just (splitAt n xs)) 

[您需要 import Data.List如果你还没有]
unfoldr的类型是:
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
unfoldr 的想法是生成函数决定是停止( Nothing)还是继续前进( Just)。如果结果是 Just那么元组的第一个元素是输出列表的下一个元素,第二个元素再次传递给生成函数。

@leftroundabout 在对该问题的评论中指出,展开在这里更加自然,因为它将输出列表元素视为彼此相似,而在折叠中,输入列表元素应进行类似处理。在这种情况下,需要每隔 n 启动一个新的子列表。输入列表的元素使这更难。

关于haskell - `group list by size` 是折叠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26190901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com