是否有'map'ping多个列表的名称?

时间:2016-07-09 04:48:26

标签: javascript haskell functional-programming ramda.js

我想在同一个传递中映射多个列表。这个模式有名字吗?

基本上,我正在寻找与此基本类似的东西的名称:

mapMultiple :: (([a,b]) -> c) -> [[a],[b]] -> [c]

但希望可以有两个以上的列表(我的haskell生锈了,我不知道如何写这种类型的签名)

对于更具体的内容,假设我列出了AB这样的内容:

A = [1, 2, 3, 4] and B = ['A', 'B', 'C', 'D']

我希望能像这样映射A和B的列表:

mapMultiple(([num, letter]) => ([ num, letter ]), [A, B]) == [[1,'A'], [2,'B'],[3,'C'],[4,'D']]

在粗糙的伪代码中,以下是如何实现它:

mapMultiple = (fn, lists) => map(fn, zip(lists))

我正在寻找这种模式/功能的通用名称。

如果你知道Ramda.js中的实现名称(或者如果它没有实现),则获得积分

2 个答案:

答案 0 :(得分:4)

mapMultiple :: (([a,b]) -> c) -> [[a],[b]] -> [c]

在Haskell中,[] :: * -> *即它需要一个类型并返回一个类型。因此,[] [a] [b][[a],[b]]没有意义。

你可能想要使用2元组。

mapMultiple :: ((a, b) -> c) -> ([a], [b]) -> [c]

在这种情况下,请查看zip :: [a] -> [b] -> [(a, b)]。您可能正在寻找的是map f . uncurry zip

答案 1 :(得分:4)

也许您正在寻找zipWith,这是Haskell中的zip + map:

> zipWith (*) [1,2,3] [4,5,6]
[4,10,18]

它也是available in Rambda

zipList3 3个列表:

> zipWith3 (\a b c -> a+2*b+3*c) [1,2,3] [4,5,6] [7,8,9]
[30,36,42]

ZipList应用程序以更加冗长的代价推广任意(静态已知)数量的列表:

> (\a b c d -> a+2*b+3*c+4*d) <$> ZipList [1,2,3] <*> ZipList [4,5,6] <*> ZipList [7,8,9] <*> ZipList [10,11,12]
ZipList {getZipList = [70,80,90]}