6
votes

Comment casser | Break | Retour dans une compréhension de la liste Haskell

Je veux retourner tous les cubes (x ^ 3) qui sont inférieurs à un paramètre Int à l'aide d'une compréhension de la liste. J'ai ce qui suit: xxx

L'astérisque est où j'ai le problème. J'ai un peu envie d'arrêter de traiter la boucle une fois que le sinon arrive. La finale [liste] ne doit avoir que les cubes, pas les autres valeurs de x . Je ne me soucie pas vraiment de la façon dont cela se passe, mais je voudrais connaître les options et quelles sont les différences (le cas échéant).

Si j'essaie de retourner null , < Code> rien , '' et quelques autres. Je sais que je suis censé retourner un type de int si je retourne quelque chose du tout.


1 commentaires

Vous ne pouvez pas utiliser la liste de compréhension de la liste?


3 Réponses :


11
votes

3 commentaires

Est-ce considéré comme une compréhension de la liste?


@chrisfrisina: Non, mais vous ne pouvez pas le faire avec une compréhension de liste. Vous pouvez faire exclure les éléments restants, mais ce n'est pas la même chose (moins efficace et ne fonctionne pas sur des listes infinies). La chose la plus proche serait probablement Carte deJust $ Mainmental IsJust $ [si x * x * x <= int alors juste x autre rien | x <- [0 ..]] .


Pour ajouter au commentaire de Miniitech, la liste des compréhensions ne vont que si loin; Lorsque vous commencez à faire des choses plus complexes, il vaut mieux apprendre à utiliser la plus grande variété de choses proposées dans le data.list module de bibliothèque (comme MainMentre ).



9
votes

Liste des compréhensions Support Guards em>. XXX PRE>

Depuis la liste des compréhensions de la liste correspond à la liste Monad, cela équivaut à l'utilisation du Guard Code> Fonction dans un faire code> Bloc: p> xxx pré>

si nous descendons cela dans >> = code> et en ligne les définitions de >> = code> et gardien code>: p> xxx pré>

ceci est apparenté à un filtre. P>

takeWhile (\x -> x ^ 3 <= int) [0..int]


0 commentaires

1
votes

Prenez une racine cube xxx

par exemple: xxx


3 commentaires

Il en résulte que [0,1,8,27] pour les deux 27 et 64 .


Maintenant, cela inclura 1000 pour tout (729, 1000).


MiniTech: soupir, supposons que je vais ajouter la vérification des limites.