我有这个(不能更改):
data Example = Value1 | Value2 | Value3
deriving (Eq, Ord, Enum, Show)
我需要此函数来返回数据定义中所有值的列表:
examples :: [Example]
但是我不能使用像这样的值的名称:
examples :: [Example]
examples = [Value1 ..]
我尝试了类似的方法,但是它们不起作用:
examples :: [Example]
examples = [x | x <- Example]
谢谢你的帮助。
最佳答案
没有toEnum 0
类的唯一方法就是使用enumFrom
生成第一个值,然后使用Bounded
生成值列表。
例如:
generateEnumValues :: (Enum a) => [a]
generateEnumValues = enumFrom (toEnum 0)
examples :: [Example]
examples = generateEnumValues
这种方法的主要问题是不能保证
toEnum 0
总是给出第一个枚举值(我在Enum docs page上看不到任何这样的保证)。但是,对于使用deriving Enum
创建的任何枚举实例都是如此。因此,如有可能,请将
Bounded
类添加到类型中,而只需使用[minBound..]
即可。关于Haskell,获取所有枚举值的列表,而无需命名它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25924399/