如何将成对列表中每对的两个元素相乘 - Haskell

How to multiply two elements of each pair from list of pairs - Haskell

我想制作函数,其中 returns 列表中的每对列表中的元素相乘。例如:

>product [1,2] [3,4]
[3,8]

我想使用 list comprehension 执行此操作。我试过这样的事情:

product :: Num a => [a] -> [a] -> [a]
product xs ys = [x*y | z<-zip xs ys, (x, _)<-z, (_, y)<-z]

但它不起作用。应该改变什么?

根据经验,每个嵌套迭代应该有一个 <-。由于您只想迭代一个列表——即 zip xs ys——因此应该只有一个 <-。因此:

scalarproduct xs ys = sum [x*y | (x,y) <- zip xs ys]

您可能还喜欢zipWith功能:

scalarproduct xs ys = sum (zipWith (*) xs ys)
scalarproduct = (sum .) . zipWith (*) -- may be readable, depending on your bent

I want to do this using list comprehension. [...]

我的建议是:不要!列表理解是一种工具,如果它们对您没有帮助,请使用其他工具。

简单的解决方案:

product :: Num a => [a] -> [a] -> [a]
product xs ys = zipWith (*) xs ys