2015-10-06 85 views
1

我正在使用cmdargs從命令行程序中獲取一些參數。我使用了一些特殊類型的在我的計劃Haskell可鍵入的實例

data Function = Max 
       | Min 
       | Moy 
       | Med 
       deriving (Eq,Data,Typeable) 

我可以直接在議論同"Max" "Min" "Moy" "Med"由類DataTypeable推導Function數據類型傳遞這些類型。我的問題是我的程序變得越來越複雜,我需要重命名我的構造函數以避免名稱衝突。

data Function = funMax 
       | funMin 
       | funMoy 
       | funMed 
       deriving (Eq,Data,Typeable) 

但是,我想繼續訪問這些構造函數與"Max" "Min" "Moy" "Med"。要做到這一點,我想我需要創建自己的DataTypeable實例Function,是嗎?

我的問題是我沒有設法創建這些實例,即使在閱讀Hackage文檔之後。

你有沒有成功創建過DataTypeable你自己的數據類型的實例?

+0

我很困惑。你是否在使用'DataKinds'並推廣這些構造函數? – dfeuer

+0

我無法理解這個問題。你想給他們不同的名字,以避免名稱衝突,但你想用舊名稱訪問它們。這看起來與我矛盾。你如何期待這將起作用? – chi

回答

3

在最近的GHC版本中,Typeable根本不能由用戶定義。其鑄造操作應該保證安全,並且只允許自動派生實例。

由於GHC 7.10,它的進一步改變:Typeable現在自動導出所有類型,所以deriving Typeable實際上是冗餘的(但可以包括用於向後兼容性。)

Data可以仍然是用戶定義,但我不確定這是個好主意。實際上,對於您的用例,我懷疑使用更簡單的Read類會更好。

您也可以通過避免分裂他們關到不同的模塊,並導入合格重命名你的構造函數:

module Types.Fun where 
data Function = Max 
       | Min 
       | Moy 
       | Med 
       deriving (Eq,Data,Typeable) 

... 

module Main where 
import qualified Types.Fun as Fun 

... case ... of Fun.Max -> ...