2015-10-06 49 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 -> ...