如何添加例如[1,2,3]到[5,4,6]返回[6,6,8] 这就是我到目前为止所做的:
func1 :: [Int]->[Int]->[Int]
func1 x y = [a+b|a<-x,b<-y]
我应该尝试删除我不想要的元素,还是有更简单的方法来执行此操作?
答案 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)
”,而我们实际上想要同时运行x
和y
。
答案 1 :(得分:2)
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
。
答案 2 :(得分:2)
简单的答案是zipWith:
zipWith (+) [1,2,3][5,4,6]