5

例如,如何将 [1,2,3] 添加到 [5,4,6] 以返回 [6,6,8] 这是我目前所拥有的:

func1 :: [Int]->[Int]->[Int]
func1 x y = [a+b|a<-x,b<-y]

我应该尝试删除我不想要的元素还是有更简单的方法来做到这一点?

4

3 回答 3

15

你正在寻找zipWith. 特别是func1 x y = zipWith (+) x y。您也可以“eta reduce”来删除那些额外的参数:func1 = zipWith (+). 这是我能想到的最有效的形式。

您当前的方法不起作用,因为[a+b | a <- x, b <- y]形成了两个嵌套循环,一个在xes 上,一个在ys 内部。这是列表推导的本质,它基于Set Builder Notation。阅读它的一种方式是“对于 x 中的每个 a,y 中的每个 b,给我”,而(a + b)我们实际上想要一起运行。xy

于 2013-10-16T14:16:42.560 回答
4

简单的答案是 zipWith:

zipWith (+) [1,2,3][5,4,6]
于 2013-10-16T19:02:55.550 回答
2
sum' :: [Int] -> [Int] -> [Int]
sum' xs ys = map (uncurry (+)) $ zip xs ys

您可以将上述内容组合成一个函数map,如.zipzipWithzipWith f xs ys = map (uncurry f) $ zip xs ys

于 2013-10-16T14:16:43.697 回答