是否有一个等同于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]
答案 0 :(得分:9)
函数zipWith可以满足您的需求。对于包含两个以上列表的案例,还有zipWith3
.. zipWith7
。
答案 1 :(得分:6)
它被称为zipWith
。
这是它的类型:
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
示例:
zipWith (*) [2,3] [4,5]
产地:
[8,15]
我可能还建议你将来看看Hoogle的这些问题。 search for "(a->a->a)->[a]->[a]->[a]"会出现您想要的内容。 :)
答案 2 :(得分:1)
更通用的解决方案是将ZipList
Applicative
实例用于列表:
let z = (+) <$> ZipList [2,3] <*> ZipList [4,5]
in runZipList z
这里的好处是它可以与任意arity的运算符一起使用,所以不再使用zipWith3
.. zipWith7
,而是再添加一个<*> e