AFAIK 没有办法在 Haskell 中做异构数组或扩展数据类型。然而,它似乎可以通过使用嵌套对轻松实现(就像 CONS 一样)。
例如
data Point2D a = Point2D a a
data Point3D a = Point3D a a a
可以像这样使用嵌套对编写;
type Point2D = (a, (a, ())
type Point3D = (a, (a, (a, ()))
这样访问器对于 Point2D 和 Point3D 来说是通用的
x = fst
y = fst.snd
z = fst.snd.snd
这种技术也可以用来扩展这样的记录
type Person = (String, ())
name = fst
type User = (String, (String, ())
email = fst.snd
ETC ...
这是一个好主意吗?如果是这样,为什么 Haskell 中没有对此类东西的内置支持?这是 GADT 的目的吗?