如果我在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中的所有元素,依此类推。
您能否提供解决我问题的线索?
尊敬,
豪尔赫马尔多纳多
答案 0 :(得分:6)
两次使用zipWith
。
multListt xss yss = zipWith (zipWith (*)) xss yss
答案 1 :(得分: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
语言扩展名。