我有这个(不能更改):

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/

10-09 15:53