2016-11-03 9 views
0

「Haskellへの穏やかな紹介」の第2章では、ユーザ定義型について説明し、組み込み型は特別な構文を除いて、ユーザ定義型とは異なります。Haskell - ビルトイン型としてのタプルとリスト:実際に宣言されているのはどうですか?

以前は、リスト、タプル、整数、文字などのいくつかの「ビルトイン」タイプを紹介しました。また、新しいユーザー定義型を定義する方法も示しました。特別な構文とは別に、組み込み型はユーザー定義型よりも特別な形でありますか?答えはいいえだ。 (特別な構文は利便性のために、歴史的な条約との整合性のためですが、何の意味的な影響を持っていません。)

ですから、次のようにタプルを定義することができます。

必ずのでできません
data (a,b)    = (a,b)       
data (a,b,c)   = (a,b,c) 
data (a,b,c,d)   = (a,b,c,d) 

を無限の宣言が必要です。では、これらのタイプは実際どのように実装されていますか?特に型宣言に対してのみパターンマッチングができるという事実に関しては?あなたがそこに3つのタプルタイプを定義し

+1

任意のプログラムで無限のタプル数を使用するつもりはありません。 –

答えて

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

をので、異なるアーリーリティを持つタプルは異なるデータ型であり、非常に多数のアーリティを持つタプルはサポートされていません。


リストの周りに存在でもある。https://github.com/ghc/ghc/blob/master/libraries/ghc-prim/GHC/Types.hs#L101

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

から

しかし、リストのための魔法の少し(特別な構文)があります。


注:私はGHCが開発された場合はGitHubではないことを知っているが、Googleの「GHCソースコード」を検索すると、正しいページが得られなかった、とGitHubのが最も簡単でした。

1

、宣言の無限の数ではないので、あなたの引数はカットしていません。 Haskellは、有限数のタプル型のみをサポートする必要があります。それゆえ、きめ細かく多くの宣言。

data Pair a b = Pair a b 

を、これは通常の2組に同型である:

実際には、あなたが定義することができます。