【发布时间】:2011-12-28 06:41:28
【问题描述】:
假设我想创建一个复杂的数据结构,其中包含多个相互递归的数据类型、多个类型变量以及一些对这些类型进行操作的函数:
data Foo x y z = FooA x | FooB (Bar x y z) | FooC (Foo x y z) | FooD (Baz x y z)
data Bar x y z = BarA y | BarB (Baz x y z) | BarC (Bar x y z) | BarD (Foo x y z)
data Baz x y z = BazA z | BazB (Foo x y z) | BazC (Baz x y z) | BazD (Bar x y z)
f :: Foo x y z -> Bar x y z -> Baz x y z
g :: Bar x y z -> Baz x y z -> Foo x y z
有没有办法可以捆绑x y z 类型,给它们一个单一的名称t,并在我真正需要它们时取出x、y 或z 类型?我不想在我的数据和函数类型声明中增加 x y z,因为添加额外的参数可能会影响很多代码。
即
data Foo t = FooA (GetX t) | FooB (Bar t) | FooC (Foo t) | FooD (Baz t)
data Bar t = BarA (GetY t) | BarB (Baz t) | BarC (Bar t) | BarD (Foo t)
data Baz t = BazA (GetZ t) | BazB (Foo t) | BazC (Baz t) | BazD (Bar t)
f :: Foo t -> Bar t -> Baz t
g :: Bar t -> Baz t -> Foo t
我不知道如何定义GetX、GetY 和GetZ 类型“函数”以从包中提取组件类型。
【问题讨论】: