【发布时间】:2016-06-06 07:57:37
【问题描述】:
我对 Haskell 中的 sum 类型有疑问。
我想创建一个 sum 类型,它由两个或多个其他类型组成,并且每个类型都可能包含多个字段。一个简单的例子是这样的:
data T3 = T1 { a :: Int, b :: Float} | T2 { x :: Char } deriving (Show)
在我的理解中,T1 和T2 是使用记录语法的数据构造函数。似乎T3 的定义会随着T1 或T2 中字段数量的增加而增加。我的问题是,如果字段数量很大,如何实际处理这些 sum 类型的构造函数?或者,将 sum 类型与记录语法混合使用是个好主意吗?
【问题讨论】:
-
我不确定您真正想要什么:如果您有大量字段,您仍然必须将它们全部写入......您会怎么做?此外,字段和总和类型不能很好地结合在一起,因为例如
a :: T3 -> Int是部分的,一旦您错误地将T2 'c'值提供给它,您的程序就会崩溃。 (OTOH,如果字段仅用于模式,那么它们是安全的。) -
“如何处理”:您遇到了什么实际问题?定义看起来太大了?你必须重复自己太多?记录不可扩展?还有什么?
-
...避免将所有数据构造函数写在一行上?
-
对不起,我的问题不是很清楚。我担心的是,由于 T1 和 T2 嵌入在 T3 中,如果 T1 或 T2 很复杂,T3 可能会变得臃肿。我正在寻找一种将 T1 和 T2 与 T3 “分离”的方法,以便可以单独定义 T1 和 T2 的内部。 @leftaroundabout 在下面展示了一个带有
T3_1和T3_2的解决方案。
标签: haskell types algebraic-data-types