比方说,我想创建一个复杂的数据结构由多个相互递归的数据类型,多类型的变量,以及一些功能对这些类型的操作:复合型与抽取式功能
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
型“功能”从束提取组件类型。
整洁!有没有办法使用记录语法,而不是简单的元组,以便每个类型的家庭只能处理它感兴趣的领域,使它独立于元组的元组? – pat 2011-12-27 19:12:09
这些不是元组值,它们是元组* *类型* - 在'(1,2,3)::(Int,Int,Int)'中,这些类型函数在模式匹配上的是'( Int,Int,Int)'部分。所以,不,没有记录,对不起:) – ehird 2011-12-27 19:21:10
另一个答案可能是“如果Haskell有可能的记录类型,但它不会”。另请参阅关于如何改进Haskell记录系统的永无休止的讨论。 – glaebhoerl 2011-12-27 19:54:06