sablonok C++Edit

fő cikk: sablon (C++)

c++ sablonokat használ az általános programozási technikák engedélyezéséhez. A C++ standard könyvtár tartalmazza a Standard sablon könyvtárat vagy az STL-t, amely sablonok keretrendszerét biztosítja a közös adatstruktúrákhoz és algoritmusokhoz. Sablonok C++ is használható sablon metaprogramm, amely egy módja annak, hogy előre értékeli néhány kódot fordítási időben helyett futási idő. A sablon specializáció, C++ sablonok tartják Turing teljes.,

MŰSZAKI áttekintésszerkesztés

kétféle sablon létezik: függvénysablonok és osztálysablonok. A függvénysablon egy minta a szokásos funkciók létrehozására az instantiált állapotban megadott paraméterező típusok alapján. Például a C++ Standard sablon könyvtár tartalmazza a Max(x, y) függvénysablont, amely olyan funkciókat hoz létre, amelyek vagy x vagy y, attól függően, hogy melyik nagyobb., max() lehetne meghatározni, mint ez:

template <typename T>T max(T x, T y) { return x < y ? y : x;}

Szakirányok ezt a funkciót sablon, instantiations a konkrét típusok is hívják csak, mint egy átlagos funkció:

std::cout << max(3, 7); // Outputs 7.

A fordító azt vizsgálja, hogy az érvek hívta max, s megállapítja, hogy ez egy hívás max(int, int)., Akkor instantiates egy változata a funkció, ahol a parameterizing típus T int, hogy az egyenértékű a következő funkció:

int max(int x, int y) { return x < y ? y : x;}

Ez hogy működik-e az érvek x, illetve az y értékek egész számok, szövegek, vagy bármilyen más típus, amelyre a kifejezés x < y értelmes, vagy még pontosabban, bármilyen típusú, amely üzemeltető< van meghatározva. A használható típusok készletéhez nincs szükség közös öröklésre, ezért nagyon hasonlít a kacsa gépeléshez., Az egyéni adattípust meghatározó program az operátor túlterhelésével definiálhatja a < jelentését az adott típushoz, ezáltal lehetővé téve annak használatát a max() függvénysablonnal. Bár ez kisebb előnynek tűnhet ebben az elszigetelt példában, egy olyan átfogó könyvtár összefüggésében, mint az STL, lehetővé teszi a programozó számára, hogy széles körű funkcionalitást kapjon egy új adattípushoz, csak néhány operátor meghatározásával., A < meghatározása lehetővé teszi egy Típus használatát a standard rendezés(), stable_sort () és binary_search() algoritmusokkal, vagy az adatszerkezetek, például készletek, halmok és asszociatív tömbök belsejében.

A C++ sablonok teljesen biztonságosak a fordításkor. Demonstrációként a standard típusú komplex nem határozza meg a< operátort, mert nincs szigorú rend a komplex számokon. Ezért max (x, y) sikertelen lesz fordítási hibával, ha x és y összetett értékek., Hasonlóképpen, más sablonok, amelyek a < – ra támaszkodnak, nem alkalmazhatók összetett adatokra, kivéve, ha összehasonlítást (functor vagy function formájában) nyújtanak. Pl.: egy komplex nem használható kulcsként egy térképhez, hacsak nincs összehasonlítás. Sajnos a fordítók történelmileg némileg ezoterikus, hosszú és haszontalan hibaüzeneteket generálnak az ilyen típusú hibákhoz. Annak biztosítása, hogy egy bizonyos objektum betartsa a method protokollt, enyhítheti ezt a problémát. A < helyett összehasonlítást használó nyelvek komplex értékeket is használhatnak kulcsként.,

a második fajta sablon, egy osztály sablon, kiterjeszti ugyanazt a koncepciót osztályok. Az osztály sablon specializáció egy osztály. Osztály sablonok gyakran használják, hogy a generikus konténerek. Például az STL-nek van egy kapcsolódó lista tárolója. Az egész számok összekapcsolt listájának elkészítéséhez írja a listát <int>. A karakterláncok listája<string>. A lista egy sor szabványos funkciók társított, hogy a munka minden kompatibilis paraméterező típusok.,

Template specializationEdit

A C++sablonjainak erőteljes jellemzője a sablon specializáció. Ez lehetővé teszi az alternatív megvalósítások nyújtását az instantált paraméterezett típus bizonyos jellemzői alapján. A sablon specializációnak két célja van: az optimalizálás bizonyos formáinak lehetővé tétele, valamint a kódfúvódás csökkentése.

például fontolja meg a rendezés () sablon funkciót. Az egyik elsődleges tevékenység, amelyet egy ilyen funkció végez, az értékek cseréje vagy cseréje a tartály két pozíciójában., Ha az értékek nagyok (a bájtok számát tekintve mindegyik tárolására szükség van), akkor gyakran gyorsabb először külön listát készíteni az objektumokra mutató mutatókról, rendezni ezeket a mutatókat, majd felépíteni a végső sorrendet. Ha az értékek elég kicsi azonban ez általában leggyorsabb, hogy csak cserélni az értékeket a helyén, ha szükséges. Továbbá, ha a paraméterezett Típus már valamilyen mutató típusú, akkor nincs szükség külön mutató tömb létrehozására., A sablon specializáció lehetővé teszi a sablon készítő számára, hogy különböző implementációkat írjon, valamint meghatározza azokat a jellemzőket, amelyeket a paraméterezett típusoknak minden egyes implementációhoz meg kell adniuk.

a funkciósablonokkal ellentétben az osztálysablonok részben specializáltak. Ez azt jelenti, hogy egy alternatív változata az osztály sablon kód lehet biztosítani, ha néhány sablon paraméterek ismertek, miközben más sablon paraméterek Generikus., Ezt fel lehet használni például egy alapértelmezett megvalósítás (az elsődleges specializáció) létrehozására, amely feltételezi, hogy a paraméterező típus másolása drága, majd részleges szakterületeket hoz létre az olcsó másolható típusok számára, ezáltal növelve az általános hatékonyságot. Az ilyen osztálysablonok ügyfelei csak szakterületeket használnak anélkül, hogy tudniuk kellene, hogy a fordító minden esetben az elsődleges specializációt vagy valamilyen részleges specializációt használta-e., Az osztály sablonok is teljesen specializáltak, ami azt jelenti, hogy alternatív megvalósítást lehet biztosítani, ha az összes paraméterező Típus ismert.

előnyök és hátrányokszerkesztés

a sablonok egyes felhasználási módjait, például a max() függvényt korábban függvényszerű előfeldolgozó makrók töltötték ki (a C programozási nyelv öröksége). Például itt van egy lehetséges max () makró:

#define max(a,b) ((a) < (b) ? (b) : (a))

a makrókat preprocesszor bővíti, a megfelelő összeállítás előtt; a sablonok a fordítási időben bővülnek., A makrók mindig bővülnek inline; sablonok is bővíthető inline függvények, amikor a fordító tartja megfelelőnek. Így mind a funkció – szerű makrók, mind a funkciósablonok nem rendelkeznek futási idővel.

a sablonokat azonban általában a makrókkal szembeni javulásnak tekintik. A sablonok típusbiztonságosak. A sablonok elkerülik a kódban található gyakori hibákat, amelyek nagymértékben kihasználják a funkciószerű makrókat, például a mellékhatások paramétereinek kétszer történő értékelését. Talán a legfontosabb, hogy a sablonokat úgy tervezték, hogy sokkal nagyobb problémákra alkalmazhatók legyenek, mint a makrók.,

a sablonok használatának négy fő hátránya van: a támogatott funkciók, a fordító támogatása, a rossz hibaüzenetek és a kód felduzzadása:

  1. A C++ sablonjainak számos funkciója hiányzik, ami egyszerű módon történő végrehajtását és használatát gyakran lehetetlenné teszi. Ehelyett a programozóknak bonyolult trükkökre kell támaszkodniuk, amelyek dagadt, nehezen érthető és nehezen karbantartható kódokhoz vezetnek. A C++ szabványok jelenlegi fejleményei súlyosbítják ezt a problémát azáltal, hogy ezeket a trükköket nagymértékben kihasználják, és sok új funkciót építenek a sablonokhoz, vagy szem előtt tartva őket.,
  2. sok fordító történelmileg gyenge támogatást sablonok, így a használata sablonok teheti kód valamivel kevésbé hordozható. A támogatás akkor is gyenge lehet, ha egy C++ fordítót olyan linkerrel használnak, amely nem c++-tudatában van, vagy amikor sablonokat próbál használni a Megosztott könyvtár határain. A legtöbb modern fordítók azonban most már meglehetősen robusztus és szabványos sablon támogatása, és az új C++ szabvány, C++11, tovább foglalkozik ezekkel a kérdésekkel.
  3. szinte minden fordító zavaró, hosszú vagy néha haszontalan hibaüzeneteket hoz létre, amikor hibákat észlel a sablonokat használó kódban., Ez megnehezítheti a sablonok fejlesztését.
  4. végül a sablonok használatához a fordítónak külön példányt kell létrehoznia a sablonozott osztályból vagy funkcióból a vele használt típusparaméterek minden permutációjához. (Erre azért van szükség, mert a C++ – ban szereplő típusok nem azonos méretűek, az adatmezők mérete pedig fontos az osztályok működéséhez.) Tehát a sablonok válogatás nélküli használata kódfúváshoz vezethet, ami túlságosan nagy végrehajtható fájlokat eredményez., A sablonok szakosodásának és származtatásának megfontolt használata azonban bizonyos esetekben drasztikusan csökkentheti az ilyen kódfúvást:

tehát a származtatás felhasználható a kód replikációjának problémájának csökkentésére, mivel sablonokat használnak? Ez magában foglalna egy sablont egy rendes osztályból. Ez a technika sikeresnek bizonyult a valódi használat során a kódfúvás megfékezésében. Azok az emberek, akik nem használnak ilyen technikát, azt találták, hogy a replikált kód még mérsékelt méretű programokban is megabájt kódterületbe kerülhet.,

– Bjarne Stroustrup, the Design and Evolution of C++, 1994

a sablonok által generált extra példányok szintén nehézséget okozhatnak a debuggereknek a sablonokkal való kecses munkavégzésben. Például, amelyben egy debug töréspont belül egy sablont a forrás fájlt vagy miss beállítás a töréspont a tényleges sokszorosított kívánt vagy lehet állítani egy töréspont minden helyen a sablon használatba venné.,

Továbbá, mivel a fordítónak makrószerű kiterjesztéseket kell végrehajtania a sablonokban, és különböző példányokat kell generálnia a fordításkor, a sablonozott osztály vagy funkció implementációs forráskódjának elérhetőnek kell lennie (pl. fejlécben) az azt használó kódhoz. Templated osztályok vagy funkciók, beleértve sok a Standard sablon könyvtár (STL), ha nem szerepel a fejléc fájlokat, nem lehet összeállítani. (Ez ellentétben áll a nem sablonos kóddal, amelyet binárisra lehet összeállítani, csak egy deklarációs fejlécfájlt biztosít a kód használatához.,) Ez hátrányt jelenthet a végrehajtási kód feltárásával, amely eltávolít néhány absztrakciót, és korlátozhatja annak használatát zárt forráskódú projektekben.

sablonok DEdit

A D programozási nyelv támogatja sablonok alapján design C++.,A legtöbb C++ template szólások viszi át D módosítás nélkül, de D hozzáteszi, néhány kiegészítő funkció:

  • Sablon paraméterei D nem korlátozódik csak típusú primitív értékek, hanem lehetővé teszi tetszőleges compile-time értékek (mint például a vonósok, a struct közvetlen használata erősen kerülendő), valamint álneve, hogy tetszőleges azonosítók, beleértve más sablonok, vagy sablon instantiations.
  • Sablonkorlátozások és a statikus if utasítás alternatívát nyújt a C++helyettesítési hibájához, nem hiba (SFINAE) mechanizmus, hasonlóan a C++ fogalmakhoz.
  • az is(…,) az expresszió lehetővé teszi a spekulatív példányosítást, hogy az objektum vonásait fordításkor ellenőrizze.
  • az auto kulcsszó és a typeof kifejezés lehetővé teszi a típuskövetést a változó deklarációkhoz és a függvényvisszatérítési értékekhez, ami viszont lehetővé teszi a “Voldemort típusok” (olyan típusok, amelyeknek nincs globális neve) használatát.

A D sablonok más szintaxist használnak, mint a C++ – ban: míg a C++ sablon paraméterei szögletes zárójelbe vannak csomagolva (sablon<param1, param2>), D felkiáltójelet és zárójelet használ: sablon!(param1, param2).,Ez elkerüli a C++ elemzési nehézségeket az összehasonlító operátorokkal való kétértelműség miatt.Ha csak egy paraméter van, a zárójelek elhagyhatók.

hagyományosan, D egyesíti a fenti funkciók, hogy fordítási idő polimorfizmus segítségével tulajdonság-alapú generikus programozás.,Például egy bemeneti tartomány minősül minden olyan típus, amely megfelel az ellenőrzés által végzett isInputRange, melyek meghatározása a következő:

A funkció, hogy elfogadja, csak a bemeneti tartományok, akkor használd a fenti sablont a sablon kényszer:

auto fun(Range)(Range range) if (isInputRange!Range){ // ...}
Kód generationEdit

amellett, hogy A sablon függvény, D is rendelkezik, számos funkció engedélyezéséhez compile-time code generation:

  • A behozatali kifejezés lehetővé teszi, hogy olvasás a fájl a lemezen, majd használja a tartalmát, mint egy karakterlánc-kifejezés.,
  • a fordítási idő mérlegelése lehetővé teszi a nyilatkozatok és tagjaik összeállítása során történő felsorolását és ellenőrzését.
  • a felhasználó által definiált attribútumok lehetővé teszik a felhasználók számára, hogy tetszőleges azonosítókat csatoljanak a nyilatkozatokhoz, amelyeket ezután a fordítási idő tükrözésével lehet felsorolni.
  • Compile-Time Function Execution (CTFE) lehetővé teszi egy részhalmaza D (korlátozott biztonságos műveletek) kell értelmezni összeállítása során.
  • A String mixins lehetővé teszi egy string kifejezés tartalmának kiértékelését és összeállítását D kódként, amely a program részévé válik.,

A fentiek kombinálása lehetővé teszi a kód generálását a meglévő nyilatkozatok alapján.Például a D serializációs keretrendszerek felsorolhatják a típus tagjait, és speciális funkciókat generálhatnak minden sorosított típushoz, hogy sorosításokat, dezerializációt hajtsanak végre.A felhasználó által definiált attribútumok tovább jelezhetik a sorosítási szabályokat.

az import expression and compile-time function execution is lehetővé teszi a domain-specifikus nyelvek hatékony végrehajtását.,Például, ha egy HTML sablont tartalmazó karakterláncot tartalmazó függvényt adunk vissza, amely ekvivalens d forráskódot ad vissza, akkor a következő módon lehet használni:

Genericity in EiffelEdit

Generic classes have been a part of Eiffel since the original method and language design. Az Eiffel Alapítvány kiadványai a generikus osztályok létrehozásának és használatának leírására a genericity kifejezést használják.

Basic/Uncontined genericityEdit

A Generikus osztályok osztálynevükkel és egy vagy több formális Generikus paraméter listájával vannak deklarálva., A következő kódot, osztály LIST van egy hivatalos generikus paraméter G

A hivatalos generikus paraméterek helyőrzők tetszőleges osztály nevet fog adni, ha a nyilatkozatot az általános osztály készült, mint látható, a két általános jelentése az alábbi, ahol a ACCOUNT vagy DEPOSIT vagy más osztály nevét. ACCOUNTés DEPOSITtényleges Generikus paramétereknek tekinthetők, mivel valós osztályneveket adnak a G helyettesítésére.,

 list_of_accounts: LIST -- Account list list_of_deposits: LIST -- Deposit list

Az Eiffel típusrendszeren belül, bár a LIST osztálynak tekinthető, nem minősül típusnak. Azonban a LIST általános származtatása, mint például a LIST , típusnak tekinthető.

Korlátozott genericityEdit

a fenti listaosztályhoz a G helyettesíthető tényleges Generikus paraméter lehet bármely más elérhető osztály., Annak az osztálykészletnek a korlátozásához, amelyből érvényes tényleges generikus paraméterek választhatók, általános korlátozást lehet megadni. Az alábbi SORTED_LIST osztály deklarációjában az Általános kényszer azt diktálja, hogy minden érvényes tényleges Generikus paraméter olyan osztály lesz, amely a COMPARABLEosztályból örököl. Az Általános kényszer biztosítja, hogy a SORTED_LIST elemei valójában rendezhetők legyenek.,

class SORTED_LIST 

Generics in JavaEdit

fő cikk: Generics in Java

támogatás a generics, vagy” containers-of-type-t ” került a Java programozási nyelv 2004 részeként J2SE 5.0. A Java, generics csak ellenőrizni fordításkor típus helyességét. Az általános típusú információkat ezután eltávolítják a type erasure nevű folyamaton keresztül, hogy megőrizzék a kompatibilitást a régi JVM implementációkkal, így futásidőben nem érhető el., Például a<> karakterlánc raw típusú listává alakul. A fordító beszúrja a típust, hogy az elemeket karakterlánc típusúvá alakítsa, amikor a listából lekérik őket, csökkentve a teljesítményt más implementációkhoz, például a C++ sablonokhoz képest.

Genericity in. net Edit

a generikusokat a. NET Framework 2.0 részeként adták hozzá 2005 novemberében, a Microsoft Research 1999-ben indult kutatási prototípusa alapján. Bár hasonló generikumok Java,.,A NET generics nem alkalmazza a típus törlését, hanem a generikumokat első osztályú mechanizmusként hajtja végre a futási időben a reification használatával. Ez a tervezési választás további funkciókat biztosít, például lehetővé teszi a visszaverődést az Általános típusok megőrzésével, valamint enyhíti a Törlés néhány korlátozását (például nem képes Generikus tömböket létrehozni). Ez azt is jelenti, hogy nincs teljesítmény hit futásidejű öntvények és általában drága boksz konverziók., Amikor a primitív és értéktípusokat Generikus argumentumként használják, speciális implementációkat kapnak, amelyek hatékony generikus gyűjteményeket és módszereket tesznek lehetővé. Mint a C++, illetve Java, beágyazott generikus típusok, mint például Szótár<string, Listát<int>> érvényes típusok, azonban tanácsos ellen a tag aláírás kód elemzés tervezési szabályok.

.,A NET hatféle általános típusú korlátozást tesz lehetővé a where kulcsszó használatával, beleértve a generikus típusok értéktípusok korlátozását, osztályokat, konstruktorokat, interfészeket. Az alábbiakban egy példa egy interfész kényszer:

a MakeAtLeast () módszer lehetővé teszi a műveletet tömbök, elemekkel Generikus T típusú. a módszer típusa kényszer azt jelzi, hogy a módszer alkalmazható bármilyen típusú T, amely végrehajtja a generikus IComparable<t> interfész., Ez biztosítja a fordítási idő hibáját, ha a módszert hívják, ha a típus nem támogatja az összehasonlítást. Az interfész biztosítja a CompareTo(T) általános módszert.

a fenti módszer Generikus típusok nélkül is írható, egyszerűen a nem Generikus tömb típus használatával. Mivel azonban a tömbök ellentmondásosak, az öntés nem lenne biztonságos, és a fordító nem találna bizonyos lehetséges hibákat, amelyeket egyébként elkapnának általános típusok használatakor. Ezen túlmenően a módszernek objektumként kell elérnie a tömbelemeket, és ehhez két elem összehasonlítására lenne szükség., (Az olyan értéktípusok esetében, mint az int, Ez boksz konverziót igényel, bár ezt meg lehet dolgozni a<t> osztály használatával, amint azt a standard gyűjteményosztályokban végezzük.)

a statikus tagok figyelemre méltó viselkedése egy generikus. Net osztályban statikus tag példányosítás futásidejű típusonként (lásd az alábbi példát).

Genericity in DelphiEdit

Delphi Object Pascal dialektusa generikusokat szerzett a Delphi 2007 kiadásban, kezdetben csak a (most megszűnt) .,NET fordító, mielőtt hozzáadnánk a natív kódhoz a Delphi 2009 kiadásban. A Delphi generics szemantikája és képességei nagyrészt a. Net 2.0 generics által készített modelleken alapulnak, bár a megvalósítás szükség szerint egészen más. Itt van egy többé-kevésbé közvetlen fordítása az első C # példa fent látható:

mint a C#, módszerek, valamint az egész Típus lehet egy vagy több típusú paramétereket. A példában a TArray egy általános típus (amelyet a nyelv határoz meg), és egy generikus módszer., A rendelkezésre álló korlátok nagyon hasonlítanak a C # – ban rendelkezésre álló korlátokhoz: bármilyen értéktípus, bármely osztály, egy adott osztály vagy interfész, valamint egy paraméter nélküli konstruktorral rendelkező osztály. A többszörös megszorítások additív Unióként működnek.

Genericity in Free PascalEdit

Free Pascal implemented generics before Delphi, and with different syntax and semantics. Az FPC 2.6.0 verziója óta azonban a Delphi stílusú szintaxis elérhető a {$mode Delphi} nyelvi mód használatakor. Így az ingyenes Pascal programozók bármilyen stílusban használhatják a generikumokat.,

Delphi és Free Pascal példa:

funkcionális nyelvekszerkesztés

Genericity in HaskellEdit

a Haskell típusosztály mechanizmusa támogatja az Általános programozást.Hat előre definiált Típusosztály a Haskell-ben (beleértve az Eq-t, az egyenlőséghez összehasonlítható típusokat, valamint azt mutatják, hogy azok a típusok, amelyek értékeit karakterláncként lehet megjeleníteni) különleges tulajdonsága a származtatott példányok támogatása., Ez azt jelenti, hogy egy programozó meghatározó egy új típus is állítják, hogy ez a típus egy példányát egy ilyen speciális osztályok, anélkül, hogy implementáció az osztály módszerek, mint általában szükséges, amikor kijelentette, osztály példánya. Az összes szükséges módszer “származtatott” lesz – vagyis automatikusan épül fel – a típus szerkezete alapján.,Például, a következő nyilatkozat egy típusú bináris fák kimondja, hogy ez egy példány az osztályok Eq és azt mutatják:

data BinTree a = Leaf a | Node (BinTree a) a (BinTree a) deriving (Eq, Show)

Ez azt eredményezi, hogy egy egyenlőség függvény ( = ) és egy string reprezentációs függvény (show) automatikusan meghatározott bármilyen típusú formában BinTree T feltéve, hogy T maga is támogatja ezeket a műveleteket.,

az EQ és Show származtatott példányainak támogatása teszi módszereiket = = és minőségileg különbözik a para-metrically polimorf függvényektől: ezek a “függvények” (pontosabban, típus-indexelt függvénycsaládok) különböző típusú értékekre alkalmazhatók, és bár minden argumentumtípus esetében eltérően viselkednek, kevés munkára van szükség egy új típus támogatásának hozzáadásához. Ralf Hinze (2004) kimutatta, hogy hasonló hatás érhető el a felhasználó által meghatározott típusú osztályok esetében bizonyos programozási technikákkal., Más kutatók a Haskell-lel és a Haskell-lel kapcsolatos (az alábbiakban tárgyalt) kiterjesztésekkel összefüggésben javasolták ennek és más típusú általánosságoknak a megközelítését.

PolyPEdit

PolyP volt az első általános programozási nyelv kiterjesztése Haskell. A polip-ban az általános funkciókat polytypicnak nevezik. A nyelv egy speciális konstrukciót vezet be, amelyben az ilyen polytypic függvények strukturális indukcióval definiálhatók egy szabályos adattípus mintafunkciójának struktúráján keresztül. Rendszeres adattípusok polip egy részhalmaza Haskell adattípusok., Rendszeres adattípusa t kell egyfajta * → *, ha a hivatalos típusú érv a meghatározást, akkor minden rekurzív hívások t kell az űrlap t. Ezek a korlátozások zárja ki a magasabb kinded datatypes, valamint a beágyazott datatypes, ahol a rekurzív hívások egy másik formája.A polip lapított funkciója itt található példaként:

generic HaskellEdit

Generic Haskell egy másik kiterjesztése Haskellnek, amelyet a hollandiai Utrechti Egyetemen fejlesztettek ki., A fájlokat úgy rendelkezik, hogy:

  • -Típusú indexelt értékek alapján meghatározott érték indexelt át a különböző Haskell típus konstruktőri (egység, primitív típusok, összegek, termékek, illetve a felhasználó által definiált típus konstruktőri). Ezen felül megadhatjuk egy adott konstruktor típusindexált értékeinek viselkedését konstruktor esetekben, majd egy általános definíciót újra felhasználhatunk egy másikban alapértelmezett esetekben.

a kapott típus-indexelt érték bármilyen típusra specializálható.

  • A Kind-indexelt típusok a fajtákra indexelt típusok, amelyeket úgy határoznak meg, hogy mind*, mind k → k’esetet adnak meg., A példányokat úgy kapjuk meg, hogy a fajta-indexelt típust egy fajtára alkalmazzuk.
  • Általános meghatározások használhatók egy típusra vagy típusra való alkalmazással. Ezt Általános alkalmazásnak nevezik. Az eredmény egy Típus vagy érték, attól függően, hogy milyen általános definíciót alkalmaznak.
  • a generikus absztrakció lehetővé teszi, hogy a generikus definíciókat egy adott típusú paraméter absztrakciójával határozzuk meg.
  • Típus-indexelt típusok olyan típusok, amelyek indexelt át a típus konstruktorok. Ezeket fel lehet használni, hogy a típusok több részt Generikus értékeket., A kapott típus-indexelt típusok bármilyen típusra specializálódhatnak.

példaként az egyenlőség függvény Generikus Haskell:

CleanEdit

tiszta kínál Generikus programozási alapú polip és a generikus Haskell által támogatott GHC> =6.0. Ez parametrizes fajta, mint azok, de kínál túlterhelés.

Egyéb nyelvekszerkesztés

a programozási nyelvek ML-családja parametrikus polimorfizmuson és generikus modulokon keresztül támogatja a generikus programozást, úgynevezett functorokat.,Mind a Standard ML, mind az OCaml funkcionátorokat biztosít, amelyek hasonlóak az osztály sablonokhoz, valamint az Ada általános csomagjaihoz. Rendszer szintaktikai absztrakciók is van egy kapcsolat a genericity – ezek valójában egy superset templating à la c++.

a Verilog modul egy vagy több paramétert vehet igénybe, amelyekhez a modul példányosításakor tényleges értékeik vannak hozzárendelve. Az egyik példa egy általános regiszter tömb, ahol a tömb szélességét egy paraméter adja meg., Az ilyen tömb, kombinálva egy általános vezetékes vektorral, Generikus puffert vagy memóriamodult készíthet tetszőleges bitszélességgel egyetlen modul implementációjából.

a VHDL, amely az Ada-ból származik, általános képességekkel is rendelkezik.