10

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

这是我所做的:

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

3 回答 3

29

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

addLists = zipWith (+)

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

于 2011-01-23T21:49:21.650 回答
6

应用函子风格:

import Control.Applicative

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

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

于 2011-01-24T07:40:17.633 回答
2
addLists xs ys = zipWith (+) xs ys
于 2011-01-23T21:49:19.967 回答