2016-07-09 2 views
2

Je souhaite mapper plusieurs listes dans le même passage. Y a-t-il un nom pour ce modèle?Y a-t-il un nom pour 'map'ping plusieurs listes?

Essentiellement, je cherche le nom de quelque chose essentiellement similaire à ceci:

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

Mais espère pouvoir avoir plus de deux listes (mon haskell est rouillé et je ne suis pas sûr de la façon dont pour écrire cette signature de type)

pour quelque chose de plus concret, disons que je listes A et B tels que:

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

Je veux être en mesure de cartographier une liste de A et B comme ceci:

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

Dans le code psuedo rugueux, voici comment vous mettre en œuvre:

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

I cherche le nom commun pour ce modèle/fonction.

points de bonus si vous connaissez son nom de mise en œuvre (ou si elle n'a pas mis en œuvre) dans Ramda.js

+0

Certainement 'zipWith'. Comme méthode: 'let xs = [1, 2, 3, 4], ys = ['A', 'B', 'C', 'D']; xs.map ((x, i) => [x, ys [i]]) 'ou en tant que fonction curry:' const zipWith = ys => xs => xs.map ((x, i) => [x , ys [i]]); zipWith (ys) (xs); '. Cependant, je n'ai pas de solution ramda. – ftor

Répondre

4

Peut-être que vous cherchez zipWith, qui est zip + carte dans Haskell:

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

Il est available in Rambda aussi.

Ou zipList3 pour 3 listes:

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

Les ZipList à généralise un nombre applicatif arbitraire (connu statiquement) des listes, au prix de plus verbosité:

> (\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]} 
4

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

Dans Haskell, [] :: * -> * à-dire qu'il prend un type et retourne un type. Par conséquent, [] [a] [b], c'est-à-dire [[a],[b]] n'a pas de sens.

Vous avez probablement voulu utiliser un 2-tuple.

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

Dans ce cas, regardez zip :: [a] -> [b] -> [(a, b)]. Ce que vous cherchez peut-être map f . uncurry zip.