在Haskell中添加列表的惯用方法是什么?

时间:2011-01-23 21:46:08

标签: haskell nested-lists

假设我想在Haskell中添加两个列表。最常用的方法是什么?

这就是我的所作所为:

addLists :: (Integral a) => [a] -> [a] -> [a]
addLists xs ys = map add $ zip xs ys
    where add (x, y) = x+y

3 个答案:

答案 0 :(得分:29)

有一个zipWith库函数,它通过使用提供的函数组合两个列表。它完全符合你的要求而且你得到了:

addLists = zipWith (+)

这使用(+)来组合作为进一步参数给出的列表元素。

答案 1 :(得分:6)

Applicative Functor风格:

import Control.Applicative

addLists xs ys = getZipList $ (+) <$> ZipList xs <*> ZipList ys

请注意,这非常难看,因为有两种方法可以使List成为Applicative Functor。第一种(和恕我直言不太有用)的方式是采取所有组合,这种方式成为“标准”,因此(+) <$> [1,2] <*> [30,40][31,41,32,42]。另一种方法是在这里按需要压缩列表,但由于每种类型只能有一个类型类实例,我们必须将列表包装在ZipLists中,并使用getZipList解包结果。

答案 2 :(得分:2)

addLists xs ys = zipWith (+) xs ys