Haskell, get a list of all enum values without naming them
I have (and cannot be changed):
data Example = Value1 | Value2 | Value3
deriving (Eq, Ord, Enum, Show)
And I need this function that returns a list of all values in the data definition:
examples :: [Example]
But I cannot use value names like this:
examples :: [Example]
examples = [Value1 ..]
I've tried things like this, but they don't work:
examples :: [Example]
examples = [x | x <- Example]
Thank you for your help.
source to share
Using toEnum 0
to generate the first value, and enumFrom
then to generate the list of values, is the only way here without a class Bounded
.
For example:
generateEnumValues :: (Enum a) => [a] generateEnumValues = enumFrom (toEnum 0) examples :: [Example] examples = generateEnumValues
The main problem with this approach is that it is not guaranteed to toEnum 0
always give the first enum value (I see no such guarantee in the Enum docs page ). However, this will be true for any enum instance created with deriving Enum
.
So, if at all possible, add the class Bounded
to the type and just use [minBound..]
.
source to share