Getting a list of all possible data type values in Haskell

前端 未结 4 1991
一整个雨季
一整个雨季 2020-12-06 04:06

If I have a data type say:

data Color = Red | Yellow | Green

Is there a way I can turn this into a list of type [Color] getting all possibl

4条回答
  •  独厮守ぢ
    2020-12-06 04:20

    Not sure if it is an anti-pattern (nor can I think of a good use right now), but it's possible. Use the Enum (allows to generate a list like [someCtor .. someOtherCtor]) and Bounded (for minBound and maxBound) type classes. Luckily, you can derive both:

    data Color = Red
               | Yellow
               | Green
               deriving (Enum, Bounded)
    
    allColors = [(minBound :: Color) ..]
    

    If you ever add another color, allColors get updated automatically. One restriction though: Enum requires all contructors to be nullary, i.e. adding Foo Int breaks the whole thing. Luckily, because a list of all possible values for this would be way too large.

    Edit: The other answer works as well, maybe better since it doesn't require deriving Bounded and is therefore a bit shorter. I'll still leave mine because I love over-engineered but extremely generic code ;)

提交回复
热议问题