我尝试在Haskell中定义一个新的数据类型,其中包含一个具有多个参数的数据类型(幻像类型):
newtype Dd x y z = ToDd Cudd.Cudd.DdNode deriving (Eq,Show)
data KnowStruct a b c =
KnS Cudd.Cudd.DdManager [Prp] (Dd a b c) [(Agent,[Prp])]
deriving (Eq,Show)
但这会给我一条错误消息:
• Expected kind ‘k0 -> k1 -> *’, but ‘Dd a’ has kind ‘*’
• In the type ‘(Dd a b c)’
为什么会这样呢?
是否也可以定义KnowStruct,而不使用所包含Dd类型的上下文/参数规范的任何要求?例如:
data KnowStruct =
KnS Cudd.Cudd.DdManager [Prp] (Dd a b c) [(Agent,[Prp])]
deriving (Eq,Show)
我创建了一个函数类来处理Dds的所有变体,并且只在作用于KnowStruct的函数中使用这些变体--所以理论上不需要指定KnowStruct包含什么类型的Dd。
1条答案
按热度按时间vxbzzdmp1#
第一种方法对我很有效,尝试给他们明确的类签名
是否也可以定义
KnowStruct
,而不使用所包含的Dd类型的上下文/参数规范的任何要求?这是可能的,并且被称为存在量化,因为类型变量不出现在返回类型中。
由于
a
,b
,c
都是存在量化的,所以当你比较两个KnowStruct
时,你是在比较Dd a1 b1 c1
和Dd a2 b2 c2
与完全不同类型的变量。我更喜欢(等效的)GADT语法