2014-01-20 53 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