2015-11-04 57 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]]