例如,如何将 [1,2,3] 添加到 [5,4,6] 以返回 [6,6,8] 这是我目前所拥有的:
func1 :: [Int]->[Int]->[Int]
func1 x y = [a+b|a<-x,b<-y]
我应该尝试删除我不想要的元素还是有更简单的方法来做到这一点?
例如,如何将 [1,2,3] 添加到 [5,4,6] 以返回 [6,6,8] 这是我目前所拥有的:
func1 :: [Int]->[Int]->[Int]
func1 x y = [a+b|a<-x,b<-y]
我应该尝试删除我不想要的元素还是有更简单的方法来做到这一点?
你正在寻找zipWith
. 特别是func1 x y = zipWith (+) x y
。您也可以“eta reduce”来删除那些额外的参数:func1 = zipWith (+)
. 这是我能想到的最有效的形式。
您当前的方法不起作用,因为[a+b | a <- x, b <- y]
形成了两个嵌套循环,一个在x
es 上,一个在y
s 内部。这是列表推导的本质,它基于Set Builder Notation。阅读它的一种方式是“对于 x 中的每个 a,y 中的每个 b,给我”,而(a + b)
我们实际上想要一起运行。x
y
简单的答案是 zipWith:
zipWith (+) [1,2,3][5,4,6]
sum' :: [Int] -> [Int] -> [Int]
sum' xs ys = map (uncurry (+)) $ zip xs ys
您可以将上述内容组合成一个函数map
,如.zip
zipWith
zipWith f xs ys = map (uncurry f) $ zip xs ys