簡體   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