如何在haskell中添加两个列表?

时间:2013-10-16 14:12:17

标签: haskell

如何添加例如[1,2,3]到[5,4,6]返回[6,6,8] 这就是我到目前为止所做的:

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

我应该尝试删除我不想要的元素,还是有更简单的方法来执行此操作?

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:2)

sum' :: [Int] -> [Int] -> [Int]
sum' xs ys = map (uncurry (+)) $ zip xs ys

您可以将上述mapzip合并为zipWith的单个函数zipWith f xs ys = map (uncurry f) $ zip xs ys

答案 2 :(得分:2)

简单的答案是zipWith:

zipWith (+) [1,2,3][5,4,6]