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

时间:2016-11-03 17:02:17

标签: list haskell tuples typing

在“对Haskell的温和介绍”的第2章中,解释了用户定义的类型,然后内置类型的概念除了特殊的语法之外,与用户定义的类型没有什么不同:

  

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

所以你可以定义一个类似于以下内容的元组:

 data (a,b)              = (a,b)                         
 data (a,b,c)            = (a,b,c)
 data (a,b,c,d)          = (a,b,c,d)

确定你不能,因为这需要无数个声明。那么这些类型实际上是如何实现的?特别是关于只能对类型声明进行模式匹配的事实?

2 个答案:

答案 0 :(得分:5)

由于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...

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

列表也在那里:

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

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

但是列表有一些魔力(特殊语法)。

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

答案 1 :(得分:1)

您在那里定义了三个元组类型,而不是一个,因此具有无限数量声明的参数不会被切断。标准的混淆Haskell只需要支持有限数量的元组类型。因此有限许多声明。

事实上,您可以定义:

 data Pair a b = Pair a b 

这与普通的2元组是同构的。