2015-11-04 77 views
0

考虑列表清单列表乘以嵌套列表

thisList = [[1], [1, 1], [1, 1, 1]] 

我怎么会多thisList,这样它会产生另一个列表

anotherList = [[1], [2, 2], [3, 3, 3]] 

我所做的功能

reps = [1] : map (\ns -> head ns:ns) reps 

哪产生thisList

感谢所有帮助

+2

? –

回答

3

你可以这样做:

zipWith (\x -> map (const x)) [1..] thisList 

用法示例:

Prelude> let thisList = [[1], [1,1], [1,1,1]] 
Prelude> zipWith (\x -> map (const x)) [1..] thisList 
[[1],[2,2],[3,3,3]] 

或者简单:

zipWith (map . const) [1..] thisList 

这是很容易。 zipWith f as bs相当于map (uncurry f) $ zip as bs。因此,我们有:

zip [1..] thisList == [(1, [1]), (2, [1,1,]), (3, [1,1,1])] 

然后我们应用f每对等:

map (const 1) [1] == [const 1 1] == [1] 
map (const 2) [1,1] == [const 2 1, const 2 1] == [2,2] 
map (const 3) [1,1,1] == [const 3 1, const 3 1, const 3 1] == [3,3,3] 

如果你的意思是长度n的子表应该由长度n[n, n, ..., n]更换,如:

thisList = [[1, 1], [1], [1], [1, 1, 1]] 
result = [[2,2], [1], [1], [3,3,3]] 

然后,你必须改变的办法:

map (\xs -> let len = length xs in replicate len len) thisList 

示例:你为什么不使用`[1,2,3]`对列表符号

Prelude> let thisList = [[1, 1], [1], [1], [1, 1, 1]] 
Prelude> map (\xs -> let len = length xs in replicate len len) thisList 
[[2,2],[1],[1],[3,3,3]]