2

是否有一个等效于map内置于 Haskell 中的两个操作数,其类型签名为:

map2 :: (a -> b -> c) -> [a] -> [b] -> [c]

以下等价应该成立:

map2 operator as bs === [operator a b | (a, b) <- zip as bs]

例子:

ghci> map2 (*) [2,3] [4,5]
[8,15]
4

3 回答 3

9

功能zipWith 可以满足您的需求。对于有两个以上列表的情况,还有zipWith3..。zipWith7

于 2013-11-07T18:18:58.100 回答
6

它被称为zipWith

这是它的类型: zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

例子:

zipWith (*) [2,3] [4,5]

产生:

[8,15]

我可能还建议您在将来查看 Hoogle 以解决此类问题。搜索“(a->a->a)->[a]->[a]->[a]”会找到您要查找的内容。:)

于 2013-11-07T18:18:18.943 回答
1

更通用的解决方案是使用for 列表的ZipList实例:Applicative

let z = (+) <$> ZipList [2,3] <*> ZipList [4,5]
 in runZipList z

这里的好处是它可以与任意数量的运算符一起使用,所以不是zipWith3.. zipWith7,你只需再添加一个<*> e

于 2013-11-07T23:43:51.803 回答