9
votes

Produit cartésien imbriqué des listes de haskell

Je voudrais faire une méthode dans laquelle je pourrais lui donner une liste de longueurs et que cela rendrait toutes les combinaisons de coordonnées cartésiennes jusqu'à ces longueurs. Plus facile à expliquer avec un exemple:

cart [2,5]
Prelude> [ [0,0],[0,1],[0,2],[0,3],[0,4],[1,0],[1,1],[1,2],[1,3],[1,4] ]

cart [2,2,2]
Prelude> [ [0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1] ]


4 commentaires

Wow, merci Kenny et Dave. Je n'ai jamais pensé jeter un appel récursif dans la définition de la compréhension de la liste - très cool. La version utilisant la carte et le pli est géniale. J'essaie d'utiliser les fonctions d'ordre supérieur lorsque je peux penser à une manière, c'est donc un excellent exemple d'étudier!


Tant que vous utilisez des fonctions d'ordre supérieur, sachez que cela ne devrait pas être cryptique. et utiliser les bonnes fonctions aidez à s'y rendre, Séquence est ce dont vous avez besoin ici.


Merci Yairchu pour la solution concise et claire et pour me présenter à Hoogle. Comment ai-je fait quelque chose sans cela ?!


Pour un autre outil intéressant de NDMitchell, vérifiez Hlint. Il suggère une nouvelle raccourcissement à ma solution alors que NewACCCT a souligné.


3 Réponses :


12
votes

Ceci peut être résolu récursivement. Tout d'abord, le Produit cartésien de rien est {∅}:

cart (x:xs) = [i:rest | i <- [0 .. x-1], rest <- cart xs]


0 commentaires

7
votes

Je parie que votre solution procédurale impliquerait une récursion. Notre solution de haskell impliquera également une récursive.

donc, récursion. D'abord le cas récursif. P>

cart [] = [[]]


0 commentaires

13
votes

umm .. xxx

Il est raisonnable d'attendre qu'un [[[a]] -> [[[a]] fonction de ce que nous attendons déjà dans la bibliothèque. Donc, si on n'est pas familier avec la séquence , trouver une simple question de HOOGLING IT.

Comme NewACCT a souligné: < Pré> xxx

Ceci peut également être trouvé en alimentant la solution précédente à hlint < / a>.


3 commentaires

cart = mapper (Enumfromto 0. Soustraire 1)


@NewacCt: Nice. BTW Hlint suggère cela aussi :)


Wow, c'est drôle à quel point la séquence enrignée. Carte (...) est la réponse à ce type de question, puisque c'était ma réaction initiale aussi.