Haskell中的二进制映射

时间:2013-11-07 18:16:49

标签: haskell

是否有一个等同于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]

3 个答案:

答案 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