List 在元组中拆分列表,列表长度为2^0,2^1,2^N使用Haskell

List 在元组中拆分列表,列表长度为2^0,2^1,2^N使用Haskell,list,haskell,split,List,Haskell,Split,我试图解决哈斯克尔的问题,但我不知道从哪里开始。 我需要将列表拆分为长度为2^0、2^1、2^3的列表。。元素。 因此,如果我们使用函数后有list[1,2,3,4,5,6,7,8,9,10,11,12,13],我们应该有结果[1],[2,3],[4,5,6,7],[8,9,10,11,12,13]您可以使用函数:,然后使用递归: blocks :: Int -> [a] -> [[a]] blocks _ [] = [] blocks n ls = la : blocks (2*n

我试图解决哈斯克尔的问题,但我不知道从哪里开始。 我需要将列表拆分为长度为2^0、2^1、2^3的列表。。元素。 因此,如果我们使用函数后有list
[1,2,3,4,5,6,7,8,9,10,11,12,13]
,我们应该有结果
[1],[2,3],[4,5,6,7],[8,9,10,11,12,13]
您可以使用函数:,然后使用递归:

blocks :: Int -> [a] -> [[a]]
blocks _ [] = []
blocks n ls = la : blocks (2*n) lb
    where ~(la,lb) = splitAt n ls

因此,如果我们有一个
块1[1,2,3,4,5,6]
我们将得到
[[1],[2,3],[4,5,6]
。在第一种情况下,我们查看给块的列表是否为空,在这种情况下,没有要拆分的内容,因此我们返回空列表。在递归情况下,我们
ls
列表拆分为
la
lb
la
是我们的第一个列表,而
lb
需要进一步拆分。我们使用
n*2
作为新的拆分长度进行递归,以确保列表的长度将以二次幂的形式增加。

也许您也可以使用
zip
groupBy
。似乎是工作,但不是那么简单

import Data.List
a="Hello World!"
p=[2^n| n<-[0..]]
pa=take (length a) p
b=[elem n pa| n<-[1..length a]]
c=zip a b
d=groupBy (\x y->snd y==False) c
e=map (map (\x->fst x)) d
导入数据。列表
a=“你好,世界!”
p=[2^n | nfst x))d

我真的不明白你为什么第一次在
偶数
奇数
上分开?@WillemVanOnsem抱歉,这可能是不重要的信息,这是我以前解决过的问题,但现在我需要解决我在问题中提到的问题。我删除了不重要的信息。很酷的解决方案,我只是用
take写了同样的内容
下降
,这基本上比yours@DanielSanchez:当然,这取决于如何实现
splitAt
,但通常它们的目标是节省一些工作,例如。