Haskell 可键入实例
Haskell Typeable instance
我正在使用 cmdargs
从命令行程序中获取一些参数。我在我的程序中使用了一些特殊类型
data Function = Max
| Min
| Moy
| Med
deriving (Eq,Data,Typeable)
我可以通过在 类 Data
和 Typeable
中派生 Function
数据类型,将这些类型直接传递到带有 "Max" "Min" "Moy" "Med"
的参数中。我的问题是我的程序变得越来越复杂,我需要重命名我的构造函数以避免名称冲突。
data Function = funMax
| funMin
| funMoy
| funMed
deriving (Eq,Data,Typeable)
但是,我想继续使用 "Max" "Min" "Moy" "Med"
访问这些构造函数。为此,我想我需要创建自己的 Data
和 Typeable
Function
实例,对吗?
我的问题是即使在阅读了 Hackage 文档后我也没有设法创建这些实例。
您是否曾经成功创建过您自己的数据类型的 Data
和 Typeable
实例?
在最新版本的 GHC 中,Typeable
根本无法由用户定义。它的转换操作应该是安全的,因此只允许自动派生的实例。
自 GHC 7.10 以来,它发生了进一步的变化:Typeable
现在自动派生为 所有 类型,因此 deriving Typeable
实际上是多余的(但可能包括为了向后兼容。)
Data
可以仍然是用户定义的,但我不确定这是个好主意。事实上,对于您的用例,我怀疑使用更简单的 Read
class 会更好。
您还可以避免重命名您的构造函数,方法是将它们拆分到不同的模块中,然后导入合格的:
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 -> ...
我正在使用 cmdargs
从命令行程序中获取一些参数。我在我的程序中使用了一些特殊类型
data Function = Max
| Min
| Moy
| Med
deriving (Eq,Data,Typeable)
我可以通过在 类 Data
和 Typeable
中派生 Function
数据类型,将这些类型直接传递到带有 "Max" "Min" "Moy" "Med"
的参数中。我的问题是我的程序变得越来越复杂,我需要重命名我的构造函数以避免名称冲突。
data Function = funMax
| funMin
| funMoy
| funMed
deriving (Eq,Data,Typeable)
但是,我想继续使用 "Max" "Min" "Moy" "Med"
访问这些构造函数。为此,我想我需要创建自己的 Data
和 Typeable
Function
实例,对吗?
我的问题是即使在阅读了 Hackage 文档后我也没有设法创建这些实例。
您是否曾经成功创建过您自己的数据类型的 Data
和 Typeable
实例?
在最新版本的 GHC 中,Typeable
根本无法由用户定义。它的转换操作应该是安全的,因此只允许自动派生的实例。
自 GHC 7.10 以来,它发生了进一步的变化:Typeable
现在自动派生为 所有 类型,因此 deriving Typeable
实际上是多余的(但可能包括为了向后兼容。)
Data
可以仍然是用户定义的,但我不确定这是个好主意。事实上,对于您的用例,我怀疑使用更简单的 Read
class 会更好。
您还可以避免重命名您的构造函数,方法是将它们拆分到不同的模块中,然后导入合格的:
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 -> ...