2013-02-11 22 views
6

type宣言とnewtype宣言の間で、読み込みコンパイル実行パイプラインのさまざまな段階での違いは何ですか?タイプとnewtypeのコンパイル時間と実行時間の差

私の仮定は、彼らが同じマシン命令までコンパイルされ、プログラムの型検査されたときの例

type Name = String 
newtype Name_ = N String 

のためにあなたはどこにでもStringが必要とされNameを使用できる場所唯一の違いは、あったことということでした同じ情報をエンコードしているにもかかわらず、Stringが期待されるName_を使用すると、型チェッカーがあなたに電話をかけます。

これが事実であるならば、私は次の宣言が有効でない理由何らかの理由が表示されていない、ので、私は質問をしています:

type List a = Either() (a, List a) 
newtype List_ a = L (Either() (a, List_ a)) 

はしかし、型チェッカーは、第二の受け入れ一方は最初のものを拒否します。何故ですか?

+10

コンパイルの問題ではなく、タイプチェックの問題です。 Haskellは "等再帰型"ではなく "iso-recursive types"を使用しているので、型を再帰的にするには、そこに 'data'または' newtype'を持たなければなりません。各選択肢にはさまざまなトレードオフがあります。これらのシステムと関連する選択の詳細については、「タイプとプログラミングの言語」を参照してください。 – luqui

+2

ありがとう、私はちょうどGoogleのために何を知るために "iso-recursive"と "equi-recursive"という名前が必要だったと思います!それを答えに変換したいなら、私はそれを受け入れます。 –

答えて

4

Luquiのコメントが答えになるはずです。ハスケルの型同義語は、最初の近似だけで、マクロ以外何もありません。つまり、型チェッカーによって完全に評価された型に展開されます。型チェッカーは無限型を扱うことができないので、Haskellには等再帰型はありません。

newtypesは、GHCでは、本質的にコア言語で等再帰型にコンパイルされるiso-recursive型を提供します。 HaskellはGHCコアではないので、あなたはそのような型にアクセスすることはできません。 Equi-recursive型は型チェッカーと人間の両方で動作するのが少し難しく、iso-recursive型は同等の能力を持ちます。

+0

フィリップに感謝します。 GHCコアに等再帰型があることを理解するのは正しいですか? 'newtype'タグの情報はどの段階で消えますか? –

+0

私はペストのようなコアを避けるので、私が塩の穀物で言うすべてを取る:GHCコアはiso再帰型を持っています。新しいタイプはコアには存在しません。私はこれを将来型の等価制約の使用に置き換えることができると信じています:List_a =(Either()(a、r))〜r => r'これらの等式の証明はすべてのユースケース(これを行うための機械はすでに存在する)。 –

+0

@PhilipJF:[もう少し複雑です](http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/FC#Newtypesarecoercedtypes)今、newtypesはデータ型と型をコンパイルしますequality axiom: 'newtype T = MkT Int'は、axT:T〜Int'を生成します。残念ながら、これは不正です。タイプインスタンスF Int = Bool;タイプインスタンスF T = Char'、次いで「Bool〜F Int」、「F Int〜F T」、および「F T〜Char」を含む。こうして、「Bool〜Char」、私たちは困っています。 [これは実際に 'GeneralizedNewtypeDeriving'でくすぐられます。](http://hackage.haskell.org/trac/ghc/ticket/1496) –