6

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

私の仮定では、それらは同じ機械語命令にコンパイルされ、唯一の違いはプログラムが型チェックされるときであるということでした。

type    Name  =   String
newtype Name_ = N String

Namea が必要な場所ならどこでも aを使用できますが、 a が必要な場所でa を使用すると、同じ情報がエンコードされていてもString、タイプチェッカーが呼び出します。Name_String

この場合、次の宣言が有効ではない理由が見当たらないため、質問しています。

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

ただし、型チェッカーは 2 番目のものを受け入れますが、最初のものは拒否します。何故ですか?

4

1 に答える 1

4

ルキのコメントは答えになるはずです。Haskell の型シノニムは、最初の概算ではマクロにすぎません。つまり、それらは型チェッカーによって完全に評価された型に展開されます。型チェッカーは無限型を処理できないため、Haskell には等再帰型がありません。

newtypesGHCでは、基本的にコア言語で等再帰型にコンパイルされる等再帰型を提供します。Haskell は GHC コアではないため、そのような型にアクセスすることはできません。等再帰型は、型チェッカーと人間の両方にとって操作が少し難しくなりますが、等再帰型は同等の力を持ちます。

于 2013-02-11T19:46:25.667 に答える