我想在同一个传递中映射多个列表。这个模式有名字吗?
基本上,我正在寻找与此基本类似的东西的名称:
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))
我正在寻找这种模式/功能的通用名称。
如果你知道Ramda.js中的实现名称(或者如果它没有实现),则获得积分
答案 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]
或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]}