元组和列表作为内置类型:它们实际上是如何声明的



在" Haskell入门"的第2章中,解释了用户定义类型,然后解释了内置类型除了特殊的语法外,与用户定义类型没有什么不同的概念:

前面我们介绍了几种"内置"类型,如列表、元组、整数和字符。我们还展示了如何定义新的用户定义类型。除了特殊的语法,内置类型是否比用户定义的类型更特殊?答案是否定的。(特殊语法是为了方便和保持历史惯例的一致性,但没有语义后果。)

所以你可以像这样定义一个元组:
 data (a,b)              = (a,b)                         
 data (a,b,c)            = (a,b,c)
 data (a,b,c,d)          = (a,b,c,d)

当然不能,因为这需要无数的声明。那么这些类型是如何实现的呢?特别是考虑到只有针对类型声明才能进行模式匹配这一事实?

由于GHC是开源的,我们可以直接查看它:


元组并没有你想象的那么神奇:

从https://github.com/ghc/ghc/blob/master/libraries/ghc-prim/GHC/Tuple.hs

data (a,b) = (a,b)
data (a,b,c) = (a,b,c)
data (a,b,c,d) = (a,b,c,d)
data (a,b,c,d,e) = (a,b,c,d,e)
data (a,b,c,d,e,f) = (a,b,c,d,e,f)
data (a,b,c,d,e,f,g) = (a,b,c,d,e,f,g)
-- and so on...

因此,具有不同属性的元组只是不同的数据类型,并且不支持具有大量属性的元组。


列表也在那里:

从https://github.com/ghc/ghc/blob/master/libraries/ghc-prim/GHC/Types.hs L101

data [] a = [] | a : [a]

但是对于列表有一点神奇的(特殊的语法)


注意:我知道GitHub不是GHC开发的地方,但在谷歌上搜索"GHC源代码"并没有产生正确的页面,GitHub是最简单的。

您在那里定义了三个元组类型,而不是一个,因此您关于无限数量声明的论点是不正确的。一个标准的配置Haskell只需要支持有限数量的元组类型。因此有有限多个声明。

实际上,你可以定义:

 data Pair a b = Pair a b 

,它同构于一个普通的二元组

最新更新