是否有“映射多个列表”的名称?

Is there a name for 'map'ping multiple lists?

我想在同一个过程中映射多个列表。这个图案有名字吗?

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

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))

我正在寻找这个 pattern/function 的通用名称。

如果您在 Ramda.js

中知道它的实现名称(或者如果它没有实现),则加分

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

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

您可能打算使用二元组。

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

既然如此,请看zip :: [a] -> [b] -> [(a, b)]。您可能正在寻找的是 map f . uncurry zip.

也许您正在寻找 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]}