12
votes

Avoir du mal à comprendre les compréhensions de la liste

Je viens de commencer à apprendre Haskell (littéralement, ce soir!) Et j'ai un peu de difficulté à comprendre la logique des compréhensions de la liste, plus spécifiquement l'opérateur . Un petit exemple sur Décrochez que vous avez un haskell trouve tous les tuples ayant une longueur inférieure à 10: xxx Pre>

Ma compréhension initiale était que celles-ci incrètiraient tous ensemble, mais après avoir vu la sortie, je ne comprends vraiment pas la méthode forte> incrémentation forte> pour ces listes. Un autre exemple qui semble me procurer est: p>

ghci> let rightTriangles = [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]


0 commentaires

3 Réponses :


4
votes

[(a, b, c) | C <- [1..10], B <- [1..10], un <- [1....10]] signifie, pour toutes les combinaisons de (A, B, C) où a est dans [1..10], B est dans [1..10], c est dans [1..10]

Si vous voulez le type (1,1,1) (2,2,2), vous devez utiliser zip : zip [1..10] [1..10 ] ou pour 3 listes, zip3 [1..10] [1..10] [1..10]


1 commentaires

Ou vous pouvez activer liste parallèle Compréhensions et écrire [(a, b, c) | C <- [1..10] | b <- [1..10] | A <- [1..10]] !



20
votes

lire [ comme "liste de", | comme "pour", <- comme "IN", , < / code> comme "et".

Les énumérations sont effectuées dans la mode imbriquée . [(a, b, c) | c <- [1...10], b <- [1..c], a <- [1..b], A ^ 2 + b ^ 2 == c ^ 2] est vraiment < / p> xxx

in Haskell cependant, ce qui précède est obtenu par la traduction suivante xxx

afin que vous puissiez vraiment voir la structure imbriquée ici . (>> =) n'est rien mystérieux aussi. Lire >> = comme "introduit" ou "enfoncé", bien que son nom officiel soit "lié". Il est défini (pour les listes) comme xxx

f ici est appelé (par carte ) sur chaque élément de < Code> XS , dans l'ordre. Il doit produire listes afin qu'ils puissent être combinés avec concat . Étant donné que les listes vides [] sont éliminées sur concat (par exemple, concat [[1], [], [3]] == [1,3] ) Tous les éléments qui ne passent pas le test sont éliminés de la sortie finale.


pour la traduction complète, voir Section 3.11, liste de compréhensions , du rapport Haskell 98. En général, une compréhension de liste peut contenir un motif, pas seulement un nom de variable. La compréhension xxx

est traduite sous la forme xxx

pat est un modèle, et < code> x est une nouvelle variable. Lorsqu'il y a une inadéquation de modèle, une liste vide est produite (au lieu d'une erreur d'exécution), et cet élément x de ls est ignoré. Ceci est utile pour un filtrage supplémentaire à base de motifs, comme par exemple. [x | Juste x <- LS, même x] où tous les rien S dans ls sont discrètement ignorés.


1 commentaires

Détaillé et très clair, m'a vraiment aidé à comprendre le matériel. Merci beaucoup!