ete*_*ent 0 haskell tuples list typing
在"对Haskell的温和介绍"的第2章中,解释了用户定义的类型,然后认为内置类型除了特殊语法之外,与用户定义的类型没有什么不同:
之前我们介绍了几种"内置"类型,如列表,元组,整数和字符.我们还展示了如何定义新的用户定义类型.除了特殊的语法之外,内置类型是否比用户定义的类型更特殊?答案是不.(特殊语法是为了方便和与历史惯例保持一致,但没有语义后果.)
所以你可以定义一个类似于以下内容的元组:
data (a,b) = (a,b)
data (a,b,c) = (a,b,c)
data (a,b,c,d) = (a,b,c,d)
Run Code Online (Sandbox Code Playgroud)
哪个肯定你不能,因为那将需要无限数量的声明.那么这些类型实际上是如何实现的?特别是关于只能针对类型声明进行模式匹配的事实?
既然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...
Run Code Online (Sandbox Code Playgroud)
因此,具有不同arities的元组只是不同的数据类型,并且不支持具有大量arities的元组.
列表也在那里:
来自 https://github.com/ghc/ghc/blob/master/libraries/ghc-prim/GHC/Types.hs#L101
data [] a = [] | a : [a]
Run Code Online (Sandbox Code Playgroud)
但是列表有一些神奇的(特殊语法).
注意:我知道GitHub不是开发GHC的地方,但在Google上搜索"ghc源代码"并没有产生正确的页面,而GitHub是最简单的.