Nemzetség (típuselmélet)

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] .

Példák

Általános következtetés a Haskellben

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 [] -- hiba

mert 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

Lásd még

Jegyzetek

  1. Az orosz nyelvű irodalomban nincs jól bevált fordítása a „ fajta ” kifejezésnek . Vannak olyan fordítási lehetőségek, mint " fajta ", " rendezés ", " típus "
  2. Pierce, 2012 , 29. fejezet. Típusok és típusok.
  3. Magasabb fajtájú általános . Letöltve: 2017. szeptember 30. Az eredetiből archiválva : 2012. június 10.
  4. Pierce, 2012 , 32. fejezet Kibővített példa: Tisztán funkcionális objektumok.
  5. A Haskell dokumentációja ugyanazt a nyilat használ mind a függvénytípusokhoz, mind a nemzetségekhez

Irodalom