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))
はしかし、型チェッカーは、第二の受け入れ一方は最初のものを拒否します。何故ですか?
コンパイルの問題ではなく、タイプチェックの問題です。 Haskellは "等再帰型"ではなく "iso-recursive types"を使用しているので、型を再帰的にするには、そこに 'data'または' newtype'を持たなければなりません。各選択肢にはさまざまなトレードオフがあります。これらのシステムと関連する選択の詳細については、「タイプとプログラミングの言語」を参照してください。 – luqui
ありがとう、私はちょうどGoogleのために何を知るために "iso-recursive"と "equi-recursive"という名前が必要だったと思います!それを答えに変換したいなら、私はそれを受け入れます。 –