Worin besteht der Unterschied in verschiedenen Phasen der Read-Compile-Run-Pipeline zwischen einer type
Deklaration und einer newtype
Deklaration?Kompilierzeit und Laufzeitdifferenz zwischen Typ und Newtype
Meine Vermutung war, dass sie den gleichen Maschinenbefehle zusammengestellt nach unten, und dass der einzige Unterschied war, wenn das Programm typechecked, wo zum Beispiel
type Name = String
newtype Name_ = N String
Sie einen Name
überall benötigt ein String
wird verwenden können, aber der Typchecker wird Sie aufrufen, wenn Sie eine Name_
verwenden, wo eine String
erwartet wird, obwohl sie die gleichen Informationen codieren.
Ich frage die Frage, denn wenn dies der Fall ist, ich keinen Grund, warum die folgenden Erklärungen nicht gültig sein sollte:
type List a = Either() (a, List a)
newtype List_ a = L (Either() (a, List_ a))
übernimmt jedoch die Typprüfer die zweite einer aber lehnt den ersten ab. Warum das?
Es ist kein Kompilierungsproblem, es ist ein Typprüfungsproblem. Haskell verwendet "iso-rekursive Typen" und nicht "gleich rekursive Typen". Wenn Sie also einen rekursiven Typ haben wollen, müssen Sie irgendwo einen 'data' oder einen' newtype' haben. Es gibt verschiedene Kompromisse zu jeder Wahl. Unter Typen und Programmiersprachen von Pierce finden Sie weitere Informationen zu diesen Systemen und den entsprechenden Optionen. – luqui
Danke, ich glaube, ich brauchte nur die Namen "iso-recursive" und "equirecursive", um zu wissen, wofür Google ist! Wenn du das in eine Antwort umwandeln willst, akzeptiere ich es. –