3

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

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

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

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

这会产生[('a',A),('b',B)...]等等。我希望Enum类型类可以让我能够[A, B, C, D, E]通过使用一些便利函数将数据类型转换为我上面描述的列表()轻松地做到这一点。

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

4

7 回答 7

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]

于 2012-10-22T20:53:09.263 回答
5

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

Prelude> data SomeData = A | B | C | D | E deriving (Show, Enum, Bounded)
Prelude> [minBound :: SomeData ..]
[A,B,C,D,E]
于 2012-10-22T20:51:53.733 回答
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

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

但是,这是在播放,实际上并没有那么清楚。

于 2012-10-22T20:53:59.613 回答
2

添加Bounded到您的推导中,您[minBound ..]可以获得完整的列表。

于 2012-10-22T20:52:19.323 回答
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]
于 2012-10-22T20:36:41.700 回答
2

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

[A .. E]

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

于 2012-10-22T20:40:24.010 回答
1

在 ghci 中试试这个

> [A ..]
[A,B,C,D,E]
于 2012-10-22T20:41:02.007 回答