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

Eri*_*son 10 haskell nested-lists

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

这是我做的:

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

sth*_*sth 29

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

addLists = zipWith (+)
Run Code Online (Sandbox Code Playgroud)

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


Lan*_*dei 6

适用的Functor风格:

import Control.Applicative

addLists xs ys = getZipList $ (+) <$> ZipList xs <*> ZipList ys
Run Code Online (Sandbox Code Playgroud)

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