Haskell Typeable 实例

Jea*_*ouX 3 haskell types instance deriving

我正在使用cmdargs从命令行程序获取一些参数。我在我的程序中使用了一些特殊类型

data Function = Max
              | Min
              | Moy
              | Med
              deriving (Eq,Data,Typeable)
Run Code Online (Sandbox Code Playgroud)

我可以通过"Max" "Min" "Moy" "Med"派生FunctionDataTypeable. 我的问题是我的程序变得越来越复杂,我需要重命名我的构造函数以避免名称冲突。

data Function = funMax
              | funMin
              | funMoy
              | funMed
              deriving (Eq,Data,Typeable)
Run Code Online (Sandbox Code Playgroud)

但是,我想继续使用"Max" "Min" "Moy" "Med". 要做到这一点,我想我需要创建自己的DataTypeable实例Function,对吗?

我的问题是即使在阅读了 Hackage 文档之后我也没有设法创建这些实例。

你是否曾经成功地创建DataTypeable你自己的数据类型的实例?

Ørj*_*sen 6

在 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 -> ...
Run Code Online (Sandbox Code Playgroud)