繁体   English   中英

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

[英]Haskell - Tuples and Lists as built-in types: how are they actually declared?

在“ 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...

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


列表也在附近:

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

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

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


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

您在此处定义了三种元组类型,没有一种定义,因此带有无限数量的声明的参数不会中断。 标准的Haskell共轭只需要支持有限数量的元组类型。 因此,有限的许多声明。

实际上,您可以定义:

 data Pair a b = Pair a b 

这与普通的2元组同构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM