Ben*_*ach 3 enums haskell algebraic-data-types
我有一段代码看起来像这样:
data SomeData = A | B | C | D | E deriving (Show, Enum)
Run Code Online (Sandbox Code Playgroud)
我希望能够轻松地将某些值映射到这些类型.说我想要char映射到一个SomeData类型,我可能这样做:
mappings = zip "abcde" [A, B, C, D, E]
Run Code Online (Sandbox Code Playgroud)
这会产生[('a',A),('b',B)...]等等.我希望Enum类型类可以让我能够[A, B, C, D, E]通过使用一些便利函数将数据类型转换为上面描述的列表()来轻松地做到这一点.
标准库中有这样的功能吗?或者我是否需要自己定义它,如果我想使用这样的东西?
你可以更通用:
-- added deriving Bounded
data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)
fullRange :: (Bounded a, Enum a) => [a]
fullRange = enumFromTo minBound maxBound
Run Code Online (Sandbox Code Playgroud)
然后只需调用fullRange(如果需要,使用显式类型注释:) fullRange :: [SomeData].
如果您另外派生Bounded,那么您甚至可以在不明确知道"最小"构造函数名称的情况下执行此操作:
Prelude> data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)
Prelude> [minBound :: SomeData ..]
[A,B,C,D,E]
Run Code Online (Sandbox Code Playgroud)