嵌套对在Haskell中是个好主意

时间:2014-03-23 10:51:03

标签: haskell gadt

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的意思吗?

2 个答案:

答案 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