Genus i typteori ( engelsk typ [1] ) är typen av en typkonstruktör , eller mer formellt, typen av en typoperator av högre ordning . Genussystemet representeras naturligt som en förälder (överlägsen) enkelt typad lambda-kalkyl , utrustad med en primitiv typ, betecknad med " *" (läs " typ "), som bildar ett slags monomorfa datatyper .
Mer tydligt är ett släkte en typ av typer , eller en metatyp - precis som en uppsättning värden bildar en typ , bildar en uppsättning typer ett släkte [2] . Samtidigt skiljer sig förekomsten av typer i mer generella typer (som undertyper) från typens tillhörighet till ett släkte - uppdelningen av olika typer i släkten sker på en mer abstrakt nivå. Till exempel är typerna " naturligt ", " heltal " och " riktigt " undertyper av den mer allmänna typen " tal "; alla fyra typerna representerar omedelbara värden och tillhör därför släktet " *". Andra släkten bildas av olika operationer på typer , precis som aritmetiken skiljer mellan tal och operationer på tal .
Det vore syntaktisk naturligt att tänka på alla polymorfa typer som typkonstruktörer ; och följaktligen är alla monomorfa konstruktörer av nolltyp . Men alla nollkonstruktorer, det vill säga alla monomorfa typer, tillhör faktiskt samma genus, nämligen " *".
Eftersom typoperatorer av högre ordning är ovanliga i de flesta programmeringsspråk , används kön i programmeringspraktik för att skilja datatyper från konstruktortyper som används för att implementera parametrisk polymorfism . Kön förekommer explicit eller implicit i språk med kompletta typsystem , såsom Haskell och Scala [3] .
Haskell tillhandahåller polymorfa typer, men tillåter inte polymorfa släkten [5] . Till exempel i denna definition av en polymorf algebraisk typ
dataträd z = Blad | _ Gaffel ( Tree z ) ( Tree z )zkan vara av vilket kön som helst, inklusive " ", " ", etc. Som standard härleder Haskell alltid könet " ", om inte annat anges (se nedan). Därför kommer typkonsistenskontrollen att avvisa följande försök att använda typ : Tree
typ FunnyTree = Träd [] -- feleftersom typen []är av släktet " ", vilket inte är det förväntade könet för , vilket alltid är " ". z
Operatörer av högre ordning är dock tillåtna. Till exempel,
data App unt z = Z ( unt z )tillhör släktet " " , det vill säga det måste vara en unär konstruktor , men här tar den en typ som argument och returnerar en annan typ. unt
Datatyper | |
---|---|
Otolkbart | |
Numerisk | |
Text | |
Referens | |
Sammansatt | |
abstrakt | |
Övrig | |
Relaterade ämnen |