type
読み取り-コンパイル-実行パイプラインのさまざまな段階で、宣言と宣言の違いは何newtype
ですか?
私の仮定では、それらは同じ機械語命令にコンパイルされ、唯一の違いはプログラムが型チェックされるときであるということでした。
type Name = String
newtype Name_ = N String
Name
a が必要な場所ならどこでも aを使用できますが、 a が必要な場所でa を使用すると、同じ情報がエンコードされていてもString
、タイプチェッカーが呼び出します。Name_
String
この場合、次の宣言が有効ではない理由が見当たらないため、質問しています。
type List a = Either () (a, List a)
newtype List_ a = L (Either () (a, List_ a))
ただし、型チェッカーは 2 番目のものを受け入れますが、最初のものは拒否します。何故ですか?