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..]都有效。