2016-09-26 63 views
0

如果非要在Haskell列表2所列出類似如下:哈斯克爾名單乘法

[[1,1,1],[3,4,6],[1,2,3]] [[3,2,2],[3,4,5],[5,4,3]] 

我必須加倍第一列表,第二列表,等等。

上面的例子應該導致

[[3,2,2],[9,16,30],[5,8,9]] 

這是我做了什麼:

multListt xss yss = [zipWith (*) xs ys | xs <- xss, ys <- yss] 

我的結果是:

[[3,2,2],[3,4,5],[5,4,3],[9,8,12],[9,16,30],[15,16,18],[3,4,6],[3,8,15], 
[5,8,9]] 

這意味着,我的過程需要1元第一個列表並將它乘以列表2中的所有元素,依此類推。

您能否提供解決我的問題的線索?

尊敬,
豪爾赫·馬爾多納多

回答

6

使用zipWith兩次。

multListt xss yss = zipWith (zipWith (*)) xss yss 
3

您可以使用兩個嵌套調用做zipWith這樣的:

zipWith (zipWith (*)) [[1,1,1],[3,4,6],[1,2,3]] [[3,2,2],[3,4,5],[5,4,3]] 

或者可以使用parallalel列表理解這樣的:

[zipWith (*) xs ys | xs <- [[1,1,1],[3,4,6],[1,2,3]] | ys <- [[3,2,2],[3,4,5],[5,4,3]]] 

最後的解決方案需要ParallelListComp語言擴展。