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 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> . Un petit exemple sur Décrochez que vous avez un haskell trouve tous les tuples ayant une longueur inférieure à 10: ghci> let rightTriangles = [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]
3 Réponses :
Si vous voulez le type (1,1,1) (2,2,2), vous devez utiliser [(a, b, c) | C <- [1..10], B <- [1..10], un <- [1....10]] code> 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] p>
zip code>: zip [1..10] [1..10 ] code> ou pour 3 listes, zip3 [1..10] [1..10] [1..10] code> p> p>
Ou vous pouvez activer liste parallèle Compréhensions et écrire [(a, b, c) | C <- [1..10] | b <- [1..10] | A <- [1..10]] code>!
lire Les énumérations sont effectuées dans la mode imbriquée em>. in Haskell cependant, ce qui précède est obtenu par la traduction suivante p> afin que vous puissiez vraiment voir la structure imbriquée ici . 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 p> est traduite sous la forme p> où [ code> comme "liste de", | code> comme "pour", <- code> comme "IN", , < / code> comme "et". [(a, b, c) | c <- [1...10], b <- [1..c], a <- [1..b], A ^ 2 + b ^ 2 == c ^ 2] code> est vraiment < / p> (>> =) code> n'est rien mystérieux aussi. Lire >> = code> comme "introduit" ou "enfoncé", bien que son nom officiel soit "lié". Il est défini (pour les listes) comme p> f code> ici est appelé (par carte code>) sur chaque élément de < Code> XS code>, dans l'ordre. Il doit produire listes em> afin qu'ils puissent être combinés avec concat code>. Étant donné que les listes vides [] code> sont éliminées sur concat code> (par exemple, concat [[1], [], [3]] == [1,3] Code>) Tous les éléments qui ne passent pas le test sont éliminés de la sortie finale. P>
pat code> est un modèle, et < code> x code> 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 code> de ls code> est ignoré. Ceci est utile pour un filtrage supplémentaire à base de motifs, comme par exemple. [x | Juste x <- LS, même x] code> où tous les rien code> S dans ls code> sont discrètement ignorés. P> p>
Détaillé et très clair, m'a vraiment aidé à comprendre le matériel. Merci beaucoup!
Je pense à la syntaxe de compréhension de la liste comme tentative de haskell d'obtenir NOTATION SET-BUILDER A > dans la langue. Nous utilisons '[' plutôt que '{' et '<-' plutôt que '∈'. La syntaxe de compréhension de la liste peut même être Généralisé une> des monades arbitraires. P>