Vous ne savez pas si c'est un anti-pattern (et je ne pense pas à un bon usage en ce moment), mais c'est possible. Utilisez le Enum
(permet de générer une liste comme [someCtor .. someOtherCtor]
) et Bounded
(pour minBound
et maxBound
). Heureusement, vous pouvez obtenir à la fois:
data Color = Red
| Yellow
| Green
deriving (Enum, Bounded)
allColors = [(minBound :: Color) ..]
Si jamais vous ajoutez une autre couleur, allColors sont mis à jour automatiquement. Une restriction cependant: Enum
exige que tous les contructeurs soient nuls, c'est-à-dire que l'ajout de Foo Int
casse le tout. Heureusement, parce qu'une liste de toutes les valeurs possibles pour cela serait beaucoup trop grande.
Editer: L'autre réponse fonctionne aussi, peut-être mieux car elle ne nécessite pas de dériver Bounded
et est donc un peu plus courte. Je laisserai toujours le mien parce que j'aime le code sur-machiné mais extrêmement générique;)
Je crois que [toEnum 0 ..] fonctionne peu importe comment vous modifiez la définition des données. – SwiftsNamesake