Jaka jest różnica, na różnych etapach procesu odczytu-kompilacji, między deklaracją type
a deklaracją newtype
?Czas kompilacji i różnica czasu między typem a nowym typem:
Moim założeniem było to, że skompilowany w dół do tych samych instrukcji maszynowych, i że jedyną różnicą było to, gdy program jest typechecked, gdzie na przykład
type Name = String
newtype Name_ = N String
Można użyć Name
wszędzie, gdzie String
jest wymagane, ale typechecker wywoła cię, jeśli użyjesz Name_
, gdzie oczekuje się String
, mimo że kodują te same informacje.
pytam pytanie, ponieważ jeśli jest to przypadek, nie widzę żadnego powodu, dlaczego następujące deklaracje nie powinny być ważne:
type List a = Either() (a, List a)
newtype List_ a = L (Either() (a, List_ a))
Jednak kontroler typu akceptuje sekundę jeden, ale odrzuca pierwszy. Dlaczego?
Nie jest to problem kompilacji, jest to problem sprawdzający typ. Haskell używa "typów rekursywnych izo-rekurencyjnych" zamiast "typów equi-rekursywnych", więc jeśli chcesz, aby Twój typ był rekursywny, musisz mieć gdzieś "dane" lub "typ nowego". Z każdym wyborem wiąże się wiele różnych kompromisów. Zobacz "Typy i języki programowania" autorstwa Pierce'a, aby dowiedzieć się więcej o tych systemach i dostępnych opcjach. – luqui
Dzięki, myślę, że po prostu potrzebowałem nazw "iso-recursive" i "equi-recursive", aby wiedzieć, co dla Google! Jeśli chcesz przekonwertować to na odpowiedź, zaakceptuję to. –