2014-01-20 52 views
3

我正在使用查找表编写Haskell中的程序。如何使用Haskell类型构造函数作为枚举?

例如。

type Table = [(Object, FilePath)] 
data Object = Player { pName :: String } 

我想在这样的方式Player可以是查找键来构建这样的:

[(Player, "data/players"), ...] 

如果我增加了一个Object类型Monster,我的表可能看起来像:

[(Player, "data/players"), (Monster, "data/mons"), ...] 

但是,我的Table类型定义表明,我正在查找实例化的对象时,实际上,我只是想检查它是否一个类型的构造函数或另一个类型的构造函数

我该如何去做这件事?

编辑:

我想我想是这样的:

data ObjectType = Player | Monster | ... 

但有没有办法避免数据构造和类型构造的重复?

回答

6

你不能用你描述的方式真正做到这一点。由于Player需要参数(pName),因此Player本身的类型为String -> Object,因此它不适合您的Table类型。

在你编辑的建议,你应该做一个独立的枚举类型不带参数的专门针对Table

data ObjectType = PlayerType | MonsterType | ... 

取决于如何Object其他构造函数将被定义,你也许能避免重复,例如

data Object = Object { objectType :: ObjectType, name :: String } 

但这并假设每一种Object将会有一个确切的说法name,没有别的。

编辑:

经过思考,我不知道是否有一个查找表结构摆在首位是有道理的。你可以用这个替换表:

lookupPath :: Object -> String 
lookupPath (Player {}) = "data/players" 
lookupPath (Monster {}) = "data/mons" 
... 

这种格式将很难做的事情就像坚持表到磁盘上,但不正是捕捉你想不匹配其参数在对象上的意向。

(该Player {}格式的比赛是匹配的,可能在未来获得更多的参数的构造函数的最佳方式,因为它把你从发生这种情况时,更新匹配码。)

+0

我认为这是只有合理的方式来处理这一点。 –

+0

我去了你的编辑,因为它更有意义(对我来说)模式匹配(现在)。 – sdasdadas