【发布时间】:2012-09-10 18:27:53
【问题描述】:
我有一些类型
data Foo = Foo
data Bar = Bar
data Baz = Baz
我想将它们用作 Map 的键。这可能吗?如果可以,怎么做?
下面的附加上下文:
我有一个构建虚拟机的应用程序。我已将工作分为几个阶段。目前我有这种类型
data CurrentPhase = PHASEONE
| PHASETWO
| PHASETHREE (deriving Eq,Ord)
到目前为止一切顺利,没有我上面提到的问题。但是,我创建了一个类型类来描述特定于阶段的操作
class PhaseOps phase where
preValidate :: JobID -> phase -> Handler (Status)
doPreProc :: JobID -> phase -> Handler (Status)
updateConfig :: JobID -> phase -> Handler ()
postValidate :: JobID -> phase -> Handler (Status)
为了使其工作,我必须创建一组新的单例数据类型以用于PhaseOps 实例。
data PhaseOne = PhaseOne
..等等
现在我有了这些单例类型和CurrentPhase。我想摆脱CurrentPhase(我将它用于以CurrentPhase 为键的地图),并使用我的单例数据类型。
【问题讨论】:
-
data FooBarBaz = Foo | Bar | Baz有问题吗? (具体来说,为什么这不起作用?) -
在单个映射中存储不同类型的键存在问题,我的意思是你将如何比较不同类型的两个值?您能做的最好的事情是为每种类型创建一个 Map 联合,并使用类型类(或类型族)围绕它编写自己的包装器。
-
我开始认为 Map 是错误的数据结构。
-
@MichaelLitchard:好吧,如果您只是告诉我们您要解决什么问题,我们可以告诉您是否是这样。不要为了完成一个步骤而寻求帮助,而是为了达到一个目标而寻求帮助。有时,您试图为实现目标而采取的步骤只是错误的和误导性的。 (有时不是,但为什么要碰巧呢?)
-
我注意到
PhaseOps看起来很像一个想要成为函数记录的类。