是否有“映射多个列表”的名称?
Is there a name for 'map'ping multiple lists?
我想在同一个过程中映射多个列表。这个图案有名字吗?
基本上,我正在寻找与此基本相似的东西的名称:
mapMultiple :: (([a,b]) -> c) -> [[a],[b]] -> [c]
但希望可以有两个以上的列表(我的 haskell 已经生锈了,我不确定如何写那个类型签名)
对于更具体的内容,假设我有列表 A
和 B
这样:
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]
或 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]}
我想在同一个过程中映射多个列表。这个图案有名字吗?
基本上,我正在寻找与此基本相似的东西的名称:
mapMultiple :: (([a,b]) -> c) -> [[a],[b]] -> [c]
但希望可以有两个以上的列表(我的 haskell 已经生锈了,我不确定如何写那个类型签名)
对于更具体的内容,假设我有列表 A
和 B
这样:
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]
或 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]}