是否有一个等效于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]
是否有一个等效于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]
功能zipWith 可以满足您的需求。对于有两个以上列表的情况,还有zipWith3
..。zipWith7
它被称为zipWith
。
这是它的类型:
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
例子:
zipWith (*) [2,3] [4,5]
产生:
[8,15]
我可能还建议您在将来查看 Hoogle 以解决此类问题。搜索“(a->a->a)->[a]->[a]->[a]”会找到您要查找的内容。:)
更通用的解决方案是使用for 列表的ZipList
实例:Applicative
let z = (+) <$> ZipList [2,3] <*> ZipList [4,5]
in runZipList z
这里的好处是它可以与任意数量的运算符一起使用,所以不是zipWith3
.. zipWith7
,你只需再添加一个<*> e