如何将成对列表中每对的两个元素相乘 - 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
我想制作函数,其中 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