A genus a típuselméletben ( angol kind [1] ) egy típuskonstruktor típusa , vagy formálisabban egy magasabb rendű típusú operátor típusa . A nemek rendszere természetesen szülő (felsőbbrendű) egyszerűen tipizált lambda-kalkulusként jelenik meg, amely egy primitív típussal van felszerelve, amelyet " *" (értsd: " típus ") jelöl, egyfajta monomorf adattípust képezve .
Pontosabban, a nemzetség egy típustípus vagy egy metatípus – ahogyan az értékek halmaza alkot egy típust , a típusok halmaza alkot egy nemzetséget [2] . Ugyanakkor a típusok előfordulása általánosabb típusokban (mint altípusokban) eltér a típusok nemzetséghez tartozásától - a különböző típusok nemzetségekre való felosztása elvontabb szinten történik. Például a „ természetes ”, „ integer ” és „ real ” típusok az általánosabb „ szám ” típus altípusai; mind a négy típus azonnali értékeket képvisel, ezért a " " nemzetségbe tartozik. Más nemzetségek a típusokon végzett különféle műveletekből jönnek létre , ahogy az aritmetika is különbséget tesz a számok és a számokkal végzett műveletek között . *
Szintaktikailag természetes lenne minden polimorf típust típuskonstruktornak tekinteni ; és ennek megfelelően minden monomorf nulla típusú konstruktor. Azonban minden null konstruktor, azaz minden monomorf típus valójában ugyanahhoz a nemzetséghez tartozik, nevezetesen a " *".
Mivel a legtöbb programozási nyelvben ritkák a magasabb rendű típusú operátorok , a programozási gyakorlatban a nemeket használják az adattípusok megkülönböztetésére a parametrikus polimorfizmus megvalósításához használt konstruktor típusoktól . A nemek kifejezetten vagy implicit módon megjelennek a teljes típusrendszerű nyelvekben , mint például a Haskell és a Scala [3] .
A Haskell polimorf típusokat biztosít, de nem engedélyezi a polimorf nemzetségeket [5] . Például ebben a polimorf algebrai típus definíciójában
adatok Fa z = Levél | Villa ( z fa ) ( fa z )ztetszőleges nemű lehet, beleértve a „ ”, „ ” stb. nemet is. Alapértelmezés szerint a Haskell mindig a „ ” nemre következtet, hacsak nincs másként megadva (lásd lent). Ezért a típuskonzisztencia-ellenőrző elutasítja a következő kísérletet a típus használatára : Tree
type FunnyTree = Fa [] -- hibamert a típus []a " " nemzetséghez tartozik , ami nem az elvárt nem a számára , ami mindig " ". z
A magasabb rendű típusú operátorok azonban megengedettek. Például,
adatok App unt z = Z ( unt z )a „ ” nemzetségbe tartozik , azaz egy unáris konstruktornak kell lennie , de itt egy típust vesz argumentumként, és egy másik típust ad vissza. unt
Adattípusok | |
---|---|
Értelmezhetetlen | |
Numerikus | |
Szöveg | |
Referencia | |
Összetett | |
absztrakt | |
Egyéb | |
Kapcsolódó témák |