List 获取Haskell中所有可能数据类型值的列表

List 获取Haskell中所有可能数据类型值的列表,list,haskell,types,List,Haskell,Types,如果我有数据类型,请说: data Color = Red | Yellow | Green 有没有办法把它变成一个[Color]类型的列表,得到所有可能的值?[红、黄、绿] 也许这是一个完全的反模式 不确定它是否是反模式(我现在也不知道它有什么好用),但这是可能的。使用Enum(允许生成类似[sometor..sometherctor]的列表)和Bounded(用于minBound和maxBound)类型类。幸运的是,您可以推导出这两个公式: data Color = Red

如果我有数据类型,请说:

data Color = Red | Yellow | Green
有没有办法把它变成一个[Color]类型的列表,得到所有可能的值?[红、黄、绿]


也许这是一个完全的反模式

不确定它是否是反模式(我现在也不知道它有什么好用),但这是可能的。使用
Enum
(允许生成类似
[sometor..sometherctor]
的列表)和
Bounded
(用于
minBound
maxBound
)类型类。幸运的是,您可以推导出这两个公式:

data Color = Red
           | Yellow
           | Green
           deriving Enum

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

allColors = [(minBound :: Color) ..]
如果您添加了其他颜色,所有颜色都会自动更新。但是有一个限制:
Enum
要求所有构造函数都为空,即添加
fooint
会破坏整个过程。幸运的是,因为所有可能值的列表太大了


编辑:另一个答案也适用,可能更好,因为它不需要派生
Bounded
,因此略短一些。我还是会留下我的代码,因为我喜欢过度设计但非常通用的代码;)

德尔南的答案肯定更好。因为我不知道如何在注释中包含一段代码,所以我将在这里给出一个概括,作为单独的答案

allValues :: (Bounded a, Enum a) => [a]
allValues = [minBound..]
现在,这适用于具有
Bounded
Enum
实例的任何类型!而
allColors
只是一个特例:

allColors :: [Color]
allColors = allValues

在许多情况下,您甚至不需要单独定义
allColors

下面是一个使用此技术使用Parsec解析枚举的示例

data FavoriteColor = Maroon | Black | Green  | Red | 
                     Blue   | Pink  | Yellow | Orange
                             deriving (Show, Read, Enum, Bounded)
和parsec解析器

parseColor :: Parser FavoriteColor           
parseColor = fmap read . foldr1 (<|>) $ map (try . string . show) 
  [ minBound :: FavoriteColor ..] 
parseColor::Parser-FavoriteColor
parseColor=fmap读取。foldr1()$map(try.string.show)
[minBound::FavoriteColor..]

当然,通过模式匹配可以更好地应用该尝试,其他一些事情可以使其更好,但这只是该技术使用的一个示例。

当我们添加
| Pink
时,这将崩溃。我相信
[toEnum 0..]
无论您如何更改数据定义都有效。我同意您的看法,因为Delnan的解决方案不需要从类型中引用任何实际值。从某种意义上说,也许我接受得太快了,但亚当斯的回答确实完全符合我的要求。(您可以像往常一样在注释中使用反勾号,但是换行符将被删除-而且,这不适合注释,您应该为此获得代表:))我相信无论您如何更改数据定义,[toEnum 0..]都有效。