声明数据类型

时间:2012-09-09 20:08:00

标签: haskell

我有一个数据类型,我用它来表示行的列和行:

data Object a = Row a
                |Column a

data Row a = Object a
             | Left(Row a)(Row a)

data Column a = Object a
             | Above(Column a)(Column a)


testfunction::Object a->String
testfunction Row(Left(c)(d)) = "Recognized row"

我想知道如何声明Object数据类型定义中的构造函数可以“包含”在其他地方定义的任何构造函数,并且Object数据类型定义中的不同构造函数可以“包含”一组不同的构造函数

所以:

data Object a = Object1(Set1 a)
                | Object2(Set2 a)

data Set1 a = A a| B a| C a| D a
data Set2 a = X a| Y a| Z a

所以唯一有效的组合是Object1(A a)Object1(B a)Object1(C a)Object1(D a),Object2(X a),Object2(Y a)和Object2(Z a)

1 个答案:

答案 0 :(得分:2)

您的Object a类型适用于所有类型a。因此,如果您的值为Object a(就像您在函数中所做的那样),那么您知道 关于a的内容 - 尤其是不< / em>知道它是Row a类型的值!

现在,这有点令人困惑,因为您已指定Row两次 - 作为类型和Object类型的构造函数。这两者根本没有关系。也就是说,

data Object a = Row a

没有任何内容迫使Row a包含Row类型的值。

最简单的解决方法 - 也许你真正打算写的 - 是:

data Object a = Row (Row a)
              | Column (Column a)

这有点令人困惑,因为您看到RowColumn两次,但每次都表示不同的事情。如果你把它写成类似的东西会更清楚:

data Object a = ObjRow (Row a)
              | ObjColumn (Column a)

(这些特别的名字并不是很好,因为我无法想到要称之为什么,但希望他们能明白这一点。)

在您定义Object之后,您应该能够按照自己的方式进行模式匹配。