AFAIK无法在Haskell中执行异构数组或扩展数据类型。 然而,似乎可以通过使用嵌套对(如CONS are)轻松实现。
例如
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
等等......
这是一个好主意,如果是这样,为什么在Haskell中没有内置支持这样的东西? 它是GADT的意思吗?
答案 0 :(得分:4)
如果这是你需要的,那可能是一个好主意。
GADT并不直接与这个想法有关(如果你想了解更多关于GADT的信息,可能最好去谷歌GADT并阅读一些链接,和/或询问一个单独的Stackoverflow问题。)
由于没有内置支持图形,矩阵操作或大多数其他内容的原因,没有内置支持;没有必要内置支持,因为它可以通过库完美地添加,例如HList package(实际上,甚至大多数 & #34;内置"到Haskell实际上只是在库中实现;只是恰好与Haskell一起分发的库。)
HList具有用于表示"异类列表的花哨类型"以及用于对它们执行操作的便利功能,并且还使用它们来开发可扩展记录"。 HLists基本上等同于你通过进一步开发嵌套元组想法所做的事情,所以你的基本想法足够好,以至于某人已经想到了它。 :)
答案 1 :(得分:0)
这是一种拥有任意嵌套对的方法:
data Y f = In (f (Y f))
data P a = Pair Int a | STOP
type PY = Y P
a, b :: PY
a = In (Pair 23 (In (Pair 24 (In STOP))))
b = In (Pair 23 (In (Pair 24 (In (Pair 25 (In STOP))))))
c = [a,b] -- a and b have same type