【发布时间】:2018-12-30 14:18:05
【问题描述】:
我想要一个数据类型来表示一组有限的整数,这些整数可以通过特定的名称来寻址。我认为最好的方法是使用枚举。
但是,有一个小问题。我知道定义枚举的唯一方法是这样的:
data MyDataType = Foo | Bar | Baz
instance Enum MyDataType
toEnum 0 = Foo
toEnum 1 = Bar
toEnum 2 = Baz
fromEnum Foo = 0
fromEnum Bar = 1
fromEnum Baz = 2
请注意,我必须重复同一对两次 - 一次是定义整数到枚举的映射,另一次是定义枚举到整数的映射。
有没有办法避免这种重复?
【问题讨论】:
-
你知道
deriving Enum吗?太神奇了! -
好的,但是如果分配给名称的值不是连续的,则它可能不起作用,例如Foo 应该是 2,Bar 应该是 4,Baz 应该是 8,等等。
-
除了 Augustss 的建议之外,我使用的一种方法是派生 Enum 并在间隙中放置填充类型(当间隙很小时):
data SomeEnum = ValueA | Reserved1 | Reserved2 | ValueB | Reserved3 | ValueC -
不过需要注意的是 - 根据问题中的代码,长手是有效且清晰的。有时抓取样板文件并不是最好的方法。
-
如果您想要的值实际上是 2、4、8、16 等。在我看来,可能还有另一种方法。比如,使用
deriving Enum,然后编写自己的toEnum'和fromEnum'版本,调用toEnum和fromEnum,然后进行2^x 转换。这是否更好,我不知道。