2015-03-30 56 views
0

我有两个函数(count和listOfNths),它们都带参数并产生一个列表。我想压缩这两个函数产生的列表。我会怎么做呢? 我试过写zip listOfNths count但那没用。由两个函数(Haskell)生成的zip列表

count n = [ x | x <- [0..n-1]] 

everyf n [] = [] 
everyf n as = head as : everyf n (drop n as) 
listOfNths :: Int -> [a] -> [[a]] 
listOfNths n xs = map (\x -> everyf n (drop x xs)) [0..n-1] 

只是一个旁注:函数listOfNths使用另一个函数(everyf),但这并不重要。

+2

附注,'[x | x < - ys]'相当于'ys',所以'count n = [0..n-1]'就足够了。 – bheklilr 2015-03-30 21:10:38

+4

我认为你想要做的是'\ n xs - > zip(listOfNths n xs)(count n)'。这会检测,但本身就是一个功能。你遇到的问题在这里,因为'zip'希望它的两个输入都是列表,但'listOfNths'和'count'都是返回列表的函数。你需要提供这些输入,然后才能将它们压缩在一起。 – bheklilr 2015-03-30 21:12:54

+0

''fn n xs =('zip' [0..n-1])。转置。 chunksOf n $ xs''。 'chunksOf'在['Data.List.Split'](https://hackage.haskell.org/package/split-0.2.2/docs/Data-List-Split.html)中。 – 2015-03-30 23:45:01

回答

3

如果我理解正确的话,你可以用做一个简单的map

fn n xs = map (\x -> (everyf n $ drop x xs, x)) [0..n-1] 

如果你坚持要用一个zip,那么你必须在功能评估荏苒之前:

fn n xs = zip (listOfNths n xs) (count n)