Haskell列表乘法列表

时间:2016-09-26 16:29:22

标签: haskell

如果我在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中的所有元素,依此类推。

您能否提供解决我问题的线索?

尊敬,
豪尔赫马尔多纳多

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语言扩展名。