我正在尝试解决Haskell问题,但我没有任何线索从哪里开始。
我需要在列表中拆分列表,长度为2 ^ 0,2 ^ 1,2 ^ 3 ..元素。
因此,如果我们在使用函数后有列表[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]]
答案 0 :(得分:4)
您可以使用函数:splitAt :: Int -> [a] -> ([a],[a])
,然后使用递归:
blocks :: Int -> [a] -> [[a]]
blocks _ [] = []
blocks n ls = la : blocks (2*n) lb
where ~(la,lb) = splitAt n ls
因此,如果我们有blocks 1 [1,2,3,4,5,6]
,我们将获得[[1],[2,3],[4,5,6]]
。在第一种情况下,我们查看我们给块的列表是否为空,在这种情况下,没有什么可以拆分,所以我们返回空列表。在递归的情况下,我们splitAt
将ls
列表导入la
和lb
。 la
是我们的第一个列表,lb
我们需要进一步拆分。我们使用n*2
作为新的分割长度进行递归,以确保列表的长度将像2的幂一样增加。
答案 1 :(得分:1)
也许您也可以使用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