有没有一种简单的方法可以将导入Enum的数据类型转换为列表?

时间:2012-10-22 20:33:46

标签: haskell enums algebraic-data-types

我有一段看起来像这样的代码:

data SomeData = A | B | C | D | E deriving (Show, Enum)

我希望能够轻松地将某些值映射到这些类型。假设我想将char映射到SomeData类型,我可能会这样做:

mappings = zip "abcde" [A, B, C, D, E]

这会产生[('a',A),('b',B)...]等等。我希望Enum类型类允许我通过使用一些便利函数将数据类型转换为上面描述的列表([A, B, C, D, E])来轻松地完成此操作。

标准库中是否有这样的功能?或者,如果我想使用这样的东西,我是否需要自己定义?

7 个答案:

答案 0 :(得分:7)

你可以更加通用:

-- added deriving Bounded
data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)

fullRange :: (Bounded a, Enum a) => [a]
fullRange = enumFromTo minBound maxBound

然后只需调用fullRange(如果需要,可以使用显式类型注释:fullRange :: [SomeData])。

答案 1 :(得分:5)

如果您另外派生Bounded,那么您甚至可以在不明确知道“最小”构造函数名称的情况下执行此操作:

Prelude> data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)
Prelude> [minBound :: SomeData ..]
[A,B,C,D,E]

答案 2 :(得分:3)

一般来说,我会做

mappings = zip "abcde" [A..]

但是我很想和

一起去
mappings = zip ['a' ..] [A ..]

因此,如果我稍后添加其他字母,代码将会更新。

我最大限度地面向未来的工作我会定义

import Data.Char

data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)

allData :: SomeData
allData = enumFrom minBound

mapppings = zip (map (toLower.head.show) allData) allData

我对未来的唯一假设是它由单个字母组成。

然而,这是在播放,而事实上并非如此。

答案 3 :(得分:2)

如果您查看http://hackage.haskell.org/packages/archive/base/3.0.3.2/doc/html/GHC-Enum.html,如果我能正确理解您的问题,您可以看到您需要的功能是Enum类型类的一部分。

>enumFrom A
[A, B, C, D, E]
it :: [SomeData]

答案 4 :(得分:2)

实际上,您可以使用范围。

[A .. E]

正如宝贵的Learn You A Haskell所述。

答案 5 :(得分:2)

Bounded添加到您的导出中,然后您可以[minBound ..]获取完整列表。

答案 6 :(得分:1)

在ghci中尝试这个

> [A ..]
[A,B,C,D,E]