Malleja C++Muokkaa

Main artikkeli: Template (C++)

C++ käyttää mallit mahdollistavat geneerisen ohjelmoinnin tekniikoita. C++ Standard Library sisältää Standard Template Library tai STL, joka tarjoaa puitteet malleja yhteisten tietorakenteiden ja algoritmien. Malleja C++ voidaan käyttää myös template metaprogramming, joka on tavallaan ennalta arvioida joitakin koodia käännettäessä sijaan run-time. Käyttämällä malli erikoistuminen, C++ Malleja pidetään Turing täydellinen.,

teknisiä overviewEdit

malleja on kahdenlaisia: funktiomalleja ja luokkamalleja. Funktio malli on malli luoda tavallisia toimintoja perustuu parametrisointi tyypit toimitetaan, kun instantiated. Esimerkiksi C++ Standard Template Library sisältää funktion malli max(x, y), joka luo funktioita, jotka palauttavat joko x tai y, kumpi on suurempi., max() voitaisiin määritellä näin:

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

Erikoisalojen tämä toiminto malli, instantiations, joilla on erityisiä tyyppejä, voidaan kutsua aivan kuten tavallinen toiminto:

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

kääntäjä tutkii argumentteja käytetään soittaa max ja toteaa, että tämä on kutsu max(int, int)., Se sitten instantiates versio toiminto, jossa parameterizing tyyppi T on int, joten vastaa seuraava toiminto:

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

Tämä toimii, onko argumenttien x ja y ovat kokonaislukuja, merkkijonoja, tai mitä tahansa muuta, jonka lauseke x < y on järkevää, tai tarkemmin sanottuna, tahansa, jonka operaattori< määritellään. Yhteistä perintöä ei tarvita niille tyypeille, joita voidaan käyttää, ja siksi se on hyvin samanlainen kuin sorsatyypitys., Ohjelma määrität mukautetun tietotyyppi voi käyttää operaattorin ylikuormitus määritellä merkitys < tyypin, jolloin sen käyttö max () – funktio template. Vaikka tämä saattaa tuntua vähäistä hyötyä tässä yksittäinen esimerkki yhteydessä kattava kirjasto, kuten STL sen avulla ohjelmoija saada laaja toiminnallisuus uusi tietotyyppi, vain määrittelemällä muutamia toimijoita siihen., Vain määritellä < mahdollistaa tyyppi, voidaan käyttää standardin sort(), stable_sort(), ja binary_search() algoritmit tai laittaa sisälle tietorakenteita, kuten sarjaa, kasoihin, ja assosiatiiviset taulukot.

C++ – mallit ovat täysin tyypiltään turvallisia käännettäessä. Osoituksena standardin tyyppi monimutkainen ei määritellä < operaattori, koska ei ole tiukkaa, jotta monimutkaisia numeroita. Siksi Max (x, y) epäonnistuu kääntyvässä virheessä, jos x ja y ovat kompleksiarvoja., Myös muita malleja, jotka ovat riippuvaisia < ei voida soveltaa monimutkaisia tietoja, ellei vertailu (muodossa functor tai toiminto) on säädetty. Esim.: kompleksia ei voida käyttää kartan avaimena, ellei vertailua ole esitetty. Valitettavasti kääntäjät historiallisesti tuottaa hieman esoteerinen, pitkä, ja hyödyttömiä virheilmoituksia tällaista virhettä. Sen varmistaminen, että tietty kohde noudattaa menetelmäprotokollaa, voi lievittää tätä ongelmaa. Kielet, jotka käyttävät vertailua < sijasta, voivat käyttää myös kompleksiarvoja avaimina.,

toinen malli, luokkamalli, laajentaa saman käsitteen luokkiin. Luokkamallin erikoistuminen on luokka. Luokkamalleja käytetään usein geneeristen säiliöiden valmistukseen. Esimerkiksi STL: ssä on linkitetty listakontti. Jotta linkitetty lista kokonaislukuja, yksi kirjoittaa list<int>. Merkkijonolista merkitään<string>. Luettelossa on joukko siihen liittyviä vakiotoimintoja, jotka toimivat yhteensopiville parametrisoiville tyypeille.,

Template specializationEdit

C++: n mallipohjien voimakas ominaisuus on template specialization. Tämä mahdollistaa vaihtoehtoiset toteutukset toimitetaan perustuu tiettyjen ominaisuuksien parametroituja tyyppi, joka on instantiated. Mallin erikoistumisella on kaksi tarkoitusta: mahdollistaa tietyt optimoinnin muodot ja vähentää koodin paisumista.

esimerkiksi harkitse sort () – mallifunktiota. Yksi tällaisen toiminnon ensisijaisista toiminnoista on arvojen vaihto tai vaihto kahdessa kontin positiossa., Jos arvot ovat suuria (mitattuna määrä tavua se vie tallentaa jokainen niistä), niin se on usein nopeampaa pitää ensin rakentaa erillinen luettelo osoittimet esineitä, lajitella ne osoittimia, ja sitten rakentaa lopullinen lajiteltu järjestyksessä. Jos arvot ovat melko pieniä, mutta se on yleensä nopein vain swap-arvot-paikka tarvittaessa. Lisäksi, jos parametrisoitu tyyppi on jo jonkin verran osoitin-tyyppi, ei ole tarvetta rakentaa erillistä osoitin array., Malli erikoistuminen mahdollistaa mallin luoja-kirjoittaa erilaisia toteutuksia ja määrittää ominaisuudet, jotka parametroituja tyyppi(s) on oltava kunkin toteuttamisesta voidaan käyttää.

toisin kuin funktiomallit, luokkamallit voivat olla osittain erikoistuneita. Tämä tarkoittaa sitä, että vaihtoehtoinen versio class template-koodi voidaan antaa, kun joitakin mallin parametrit ovat tiedossa, jättäen muut mallin parametrit generic., Tätä voidaan käyttää, esimerkiksi, luoda oletus täytäntöönpano (ensisijainen erikoistuminen), joka olettaa, että kopiointi parameterizing tyyppi on kallista ja sitten luoda osittainen erikoisalojen tyypit, jotka ovat halpa kopio, mikä lisää yleistä tehokkuutta. Asiakkaita tällaisen luokan malli, vain käyttää erikoisalojen it tarvitsematta tietää, onko kääntäjä käyttänyt ensisijainen erikoistuminen tai jotkut osittainen erikoistuminen kussakin tapauksessa., Luokan malleja voi myös olla täysin erikoistuneita, mikä tarkoittaa, että vaihtoehtoinen toteutus voidaan antaa, kun kaikki parameterizing tyypit ovat tiedossa.

Edut ja disadvantagesEdit

Jotkut käyttää malleja, kuten max () – funktio, oli aiemmin täynnä toiminto-kuten preprocessor makrojen (perintö C programming language). Esimerkiksi, tässä on mahdollista max() makro:

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

Makrot ovat laajentaneet preprocessor, ennen kokoaminen oikea; malleja on laajennettu käännöksen yhteydessä., Makrot ovat aina laajennettu inline; malleja voidaan myös laajentaa inline toimintoja, kun Kääntäjä pitää sitä sopivana. Näin ollen sekä funktiomaisilla makroilla että funktiomalleilla ei ole ajonaikaisia ylimenoja.

mallipohjia pidetään kuitenkin yleisesti makroihin verrattuna parannuksena näihin tarkoituksiin. Mallit ovat tyypiltään turvallisia. Malleja välttää joitakin yleisiä virheitä löytyy koodi, joka tekee raskaan käyttää toiminto, kuten makrot, kuten arvioida parametrit sivuvaikutuksia kahdesti. Ehkä mikä tärkeintä, mallit suunniteltiin sovellettavaksi paljon suurempiin ongelmiin kuin makrot.,

On olemassa neljä ensisijaista haittoja käytön malleja: tuetut ominaisuudet, kääntäjä tuki, huono virhe viestejä, ja koodi paisunut:

  1. Mallit C++ puuttuu monia ominaisuuksia, joka tekee toteuttamiseksi ja käyttää niitä suoraviivainen tapa usein mahdotonta. Sen sijaan ohjelmoijat joutuvat turvautumaan monimutkaisiin temppuihin, jotka johtavat paisuneisiin, vaikeasti ymmärrettäviin ja vaikeasti ylläpidettäviin koodeihin. Nykyinen kehitys C++ – standardeissa pahentaa tätä ongelmaa hyödyntämällä näitä temppuja ja rakentamalla paljon uusia ominaisuuksia malleja niihin tai ne mielessä.,
  2. monilla kääntäjillä on historiallisesti huono tuki malleille, joten mallien käyttö voi tehdä koodista hieman vähemmän kannettavaa. Tuki voi olla huono myös silloin, kun C++-kääntäjää käytetään linkkerin kanssa, joka ei ole c++ – tietoinen, tai kun yritetään käyttää malleja yli jaettujen kirjastojen rajojen. Useimmissa moderneissa kääntäjissä on kuitenkin nyt melko vankka ja standardipohjainen tuki, ja uusi c++ – standardi, C++11, käsittelee näitä kysymyksiä edelleen.
  3. Lähes kaikki kääntäjät tuottavat sekava, pitkä, tai joskus hyödytön virhe viestejä, kun virheitä havaitaan koodi, joka käyttää malleja., Tämä voi vaikeuttaa mallien kehittämistä.
  4. lopulta mallien käyttö edellyttää kääntäjän tuottavan erillisen templated-luokan tai-funktion jokaista sen kanssa käytettyjen tyyppiparametrien permutaatiota varten. (Tämä on tarpeen, koska C++: n tyypit eivät ole kaikki samankokoisia, ja tietokenttien koot ovat tärkeitä luokkien toiminnalle.) Joten mallien summittainen käyttö voi johtaa koodin paisumiseen, mikä johtaa liian suuriin suorituksiin., Kuitenkin, järkevä käyttö malli erikoistuminen ja johtaminen voi dramaattisesti vähentää tällaista koodia paisunut joissakin tapauksissa:

Niin, voi johtaminen voidaan vähentää ongelmaa koodi monistaa, koska malleja käytetään? Tämä edellyttäisi mallin laatimista tavallisesta luokasta. Tämä tekniikka osoittautui onnistuneeksi koodiläiskän hillitsemisessä todellisessa käytössä. Ihmiset, jotka eivät käytä tekniikkaa, kuten tämä ovat havainneet, että monistaa koodi voi maksaa megatavua koodia tilaa jopa kohtalainen koko ohjelmia.,

— Bjarne Stroustrup, Suunnittelu ja Kehitys, C++, 1994

ylimääräistä instantiations syntyy malleja voi myös aiheuttaa debuggers on vaikeuksia toimii sulavasti malleja. Esimerkiksi asettamalla debug murtuessa sisällä malli lähteestä tiedosto voi joko neiti asetus taittopiste todellinen instanssien haluttu tai voi asettaa breakpoint joka paikassa malli on instantiated.,

Myös, koska kääntäjä tarvitsee tehdä makro -, kuten laajennuksia, malleja ja tuottaa eri tapauksissa niistä käännöksen aika, täytäntöönpano lähdekoodin malleihin luokan tai toiminto on saatavilla (esim. sisällyttää header) koodi käyttää sitä. Malleihin luokat tai toimintoja, mukaan lukien paljon Standard Template Library (STL), jos se ei sisälly header-tiedostoja, ei voida laatia. (Tämä on toisin kuin ei-malleihin koodi, joka voi olla koottu binary, joka tarjoaa vain ilmoitukset header-koodi käyttämällä sitä.,) Tämä voi olla haitta altistamalla toteuttava koodi, joka poistaa joitakin abstraktioita, ja ne saattavat rajoittaa sen käyttöä suljetun lähdekoodin projekteja.

Malleja DEdit

D-ohjelmointikieli tukee malleja perustuu design C++.,Useimmat C++ template sanontojen kantaa yli D ilman muutos, mutta D lisää joitakin uusia toimintoja:

  • Mallin parametreja D eivät rajoitu vain tyypit ja primitiivinen arvoja, mutta myös salli mielivaltaisia käännettäessä arvot (kuten jouset ja struct literaaleja), ja aliakset mielivaltaisesti tunnisteita, myös muita malleja tai malli instantiations.
  • Mallin rajoitteet ja staattinen, jos lausunto tarjota vaihtoehto C++: n korvaaminen vika ei ole virhe (SFINAE) mekanismi, samanlainen kuin C++ käsitteitä.
  • is (…,) ilmaisun avulla spekulatiivinen instantiaatio voi tarkistaa kohteen piirteet kääntövaiheessa.
  • auto-avainsanan ja typeof ilmaisun avulla tyyppi päättely muuttujan ilmoitukset ja-funktio palauttaa arvoja, mikä puolestaan mahdollistaa ”Voldemort tyypit” (tyypit, jotka eivät ole maailmanlaajuinen nimi).

Malleja, D-käyttää eri syntaksia kuin C++: ottaa huomioon, että C++ mallin parametrit ovat kääritty kulmikas suluissa (Template<param1, param2>),D käyttää huudahdus merkki ja sulut: Malli!(param1, param2).,Näin vältetään C++ – jäsennysvaikeudet, jotka johtuvat epäselvyydestä vertailuoperaattoreiden kanssa.Jos parametria on vain yksi, sulkeet voidaan jättää pois.

Perinteisesti D yhdistää edellä mainitut ominaisuudet tarjota käännettäessä polymorfismi käyttäen piirre-pohjainen geneerinen ohjelmointi.,Esimerkiksi input-alue on määritelty tyyppi, joka täyttää tarkastukset suoritetaan isInputRange, joka on määritelty seuraavasti:

– funktio, joka hyväksyy vain input-alueet voidaan sitten käyttää edellä malli mallissa rajoite:

auto fun(Range)(Range range) if (isInputRange!Range){ // ...}
Koodi generationEdit

lisäksi template metaprogramming, D tarjoaa myös useita ominaisuuksia, jotta käännettäessä koodin generointi:

  • tuo ilme mahdollistaa tiedoston lukeminen levyltä ja käyttää sen sisältö merkkijonona ilme.,
  • Compile-time reflection mahdollistaa ilmoitusten ja niiden jäsenten luetteloinnin ja tarkastamisen kokoamisen aikana.
  • käyttäjän määrittelemien attribuuttien avulla käyttäjät voivat liittää mielivaltaisia tunnisteita ilmoituksiin, jotka voidaan sitten luetella kääntöaikaheijastuksella.
  • Compile-Time function Execution (CTFE) mahdollistaa D-osajoukon (rajoitettu turvallisiin operaatioihin) tulkitsemisen kokoamisen aikana.
  • String mixins mahdollistaa merkkijonon ilmaisun sisällön arvioinnin ja koostamisen d-koodina, josta tulee osa ohjelmaa.,

yhdistämällä edellä mainittu mahdollistaa olemassa oleviin ilmoituksiin perustuvan koodin luomisen.Esimerkiksi D serialization frameworks voi luetella tyypin jäsenet ja luoda erikoistoimintoja kullekin serialized typeto suorittaa serialization ja deserialization.Käyttäjän määrittelemät attribuutit voivat edelleen osoittaa sarjallistamissääntöjä.

tuonti-lauseke ja kääntöaikatoiminnon toteutus mahdollistavat myös verkkotunnuskohtaisten kielten tehokkaan toteutuksen.,Esimerkiksi, annetaan funktio, joka vie merkkijono, joka sisältää HTML-mallipohjan ja palauttaa vastaava D lähdekoodin, on mahdollista käyttää sitä seuraavalla tavalla:

Genericity vuonna EiffelEdit

Generic luokat ovat olleet osa Eiffel-koska alkuperäinen menetelmä-ja kieli-suunnittelu. Eiffelin perustajajulkaisuissa käytetään termiä genericity kuvaamaan geneeristen luokkien luomista ja käyttöä.

Perus/Rajoittamaton genericityEdit

Generic luokat ilmoitetaan niiden luokan nimi ja luettelo yhden tai useamman virallisen geneeriset parametrit., Seuraavassa koodi, luokka LIST on yksi virallisen geneerinen parametri G

muodollinen geneeriset parametrit ovat paikanvaraajia mielivaltainen luokan nimiä, jotka toimitetaan, kun ilmoitus geneerinen luokka on tehty, kuten on esitetty kaksi generic sanat alla jossa ACCOUNT ja DEPOSIT muita luokan nimiä. ACCOUNT ja DEPOSIT pidetään todellinen yleisiä parametreja, koska ne tarjoavat oikean luokan nimiä korvata G todellisessa käytössä.,

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

Sisällä Eiffel-tyyppinen järjestelmä, vaikka luokka LIST pidetään luokassa, sitä ei pidetä tyyppi. Kuitenkin, yleinen johtaminen LIST kuten LIST pidetään tyyppi.

Rajoittaa genericityEdit

listan luokan edellä, todellinen geneerinen parametri korvata G voi olla mikä tahansa muita käytettävissä olevia luokan., Niiden luokkien joukon rajoittamiseksi, joista voidaan valita voimassa olevat todelliset yleiset parametrit, voidaan määrittää yleinen rajoite. Ilmoitus luokan SORTED_LIST alla, yleinen rajoite määrää, että mikä tahansa kelvollinen todellinen geneerinen parametri on luokka, joka perii luokan COMPARABLE. Yleinen rajoite varmistaa, että SORTED_LIST elementit voidaan itse asiassa lajitella.,

class SORTED_LIST 

Geneeristen vuonna JavaEdit

Main artikkeli: Geneeristen Java

Tukea generics, tai ”kontit-of-tyyppi-T” on lisätty Java-ohjelmointikielellä vuonna 2004 osana J2SE 5.0. Javassa generiikat tarkastetaan vain kääntövaiheessa tyypin oikeellisuuden varalta. Geneerinen tyyppi tieto on sitten poistettu kautta prosessi kutsutaan tyyppi poistaminen, säilyttää yhteensopivuus vanhojen JVM toteutuksissa, joten se ei ole käytettävissä ajon aikana., Esimerkiksi List<String> muunnetaan raaka-tyyppi-Luettelosta. Kääntäjä lisää tyyppi heittää muuntaa elementit String tyyppi, kun ne haetaan listasta, vähentää suorituskykyä verrattuna muihin toteutuksiin, kuten C++ malleja.

Genericity vuonna .NET Muokkaa

Geneeristen lisättiin osana .NET Framework 2.0 marraskuussa 2005, joka perustuu tutkimus-prototyyppi Microsoft Tutkimus alkoi vuonna 1999. Vaikka samanlainen generics Java,.,NET generics ei sovella type erasure-järjestelmää, vaan se toteuttaa Genericsin ensimmäisen luokan mekanismina ajonaikaisessa uudelleensijoituksessa. Tämä design valinta tarjoaa lisätoimintoja, kuten jolloin heijastus säilyttäminen generic tyypit, sekä lievittää joitakin rajoituksia poistaminen (kuten ei pysty luomaan generic taulukot). Tämä tarkoittaa myös sitä, että ei ole suorituskykyä osuma runtime heittää ja yleensä kalliita nyrkkeily tuloksia., Kun alkeellisia ja arvotyyppejä käytetään yleisinä argumentteina, ne saavat erikoistuneita toteutuksia, mikä mahdollistaa tehokkaat geneeriset kokoelmat ja menetelmät. Kuten C++ ja Java, sisäkkäisiä geneerisiä tyyppejä, kuten Sanakirja<string, List<int>> ovat voimassa tyypit, kuitenkin kehotetaan vastaan jäsen allekirjoitukset koodi analyysi suunnittelun sääntöjä.

.,NET mahdollistaa kuusi lajikkeiden yleinen tyyppi rajoitteita käyttämällä, jossa avainsanan mukaan lukien rajoittaa generic lajit arvo lajit, voidaan luokat, on rakentajien ja toteuttaa käyttöliittymiä. Alla on esimerkki, jossa rajapinnan rajoite:

MakeAtLeast() menetelmä mahdollistaa käytön taulukot, elementtejä geneerinen tyyppi T. menetelmä on tyyppi rajoite osoittaa, että menetelmä on sovellettavissa minkä tahansa T, joka toteuttaa generic IComparable<T> käyttöliittymä., Tämä takaa kääntöaikavirheen, jos menetelmää kutsutaan, jos Tyyppi ei tue vertailua. Käyttöliittymä tarjoaa yleisen menetelmän CompareTo (T).

edellä mainittu menetelmä voitiin kirjoittaa myös ilman geneerisiä tyyppejä, yksinkertaisesti käyttämällä ei-geneeristä Array-tyyppiä. Koska matriisit ovat kuitenkin ristiriidassa keskenään, valaminen ei olisi tyypiltään turvallista, eikä kääntäjä pystyisi löytämään tiettyjä mahdollisia virheitä, jotka muuten jäisivät kiinni geneerisiä tyyppejä käytettäessä. Lisäksi menetelmä tarvitsisi käyttää array kohteita objekteja sijaan, ja vaatisi valu vertailla kahta elementtiä., (Arvo tyypit kuten tyyppejä, kuten int tämä edellyttää nyrkkeily muuntaminen, vaikka tämä voidaan kiertää käyttämällä Comparer<T> luokka, kuten on tehty standardin kokoelma luokkia.)

staattisten jäsenten huomattava käyttäytyminen geneerisessä.Net-luokassa on staattinen jäsenten instantiaatio ajallista tyyppiä kohti (KS. esimerkki alla).

Genericity vuonna DelphiEdit

Delphin Object Pascal murre hankittu geneerisiä valmisteita Delphi 2007 julkaisu, aluksi vain (nyt lopetettu) .,NET-kääntäjä ennen kuin se lisätään natiiviin koodiin Delphi 2009-julkaisussa. Semantiikan ja valmiuksia Delphi geneeriset ovat suurelta osin mallinnettu niitä oli geneerisiä valmisteita .NET 2.0, vaikka täytäntöönpano on pakosta varsin erilainen. Tässä on enemmän tai vähemmän suora käännös ensimmäinen C# – esimerkissä yllä:

Kuten C#, menetelmiä sekä koko tyypit voi olla yksi tai useampia tyypin parametrit. Esimerkissä TArray on geneerinen tyyppi (kielen määrittelemä) ja MakeAtLeast yleinen menetelmä., Käytettävissä olevat rajoitteet ovat hyvin samanlaisia kuin C#: n käytettävissä olevat rajoitteet: mikä tahansa arvotyyppi, mikä tahansa luokka, tietty luokka tai käyttöliittymä ja luokka, jossa on parametriton rakentaja. Moninkertaiset rajoitteet toimivat additiivisena unionina.

Genericity Vapaa PascalEdit

Free Pascal täytäntöön geneeristen ennen Delphi, ja eri syntaksia ja semantiikkaa. FPC-version 2.6.0 jälkeen Delphi-tyylinen syntaksi on kuitenkin saatavilla {$mode Delphi} – kielitilaa käytettäessä. Siten vapaa Pascal ohjelmoijat voivat käyttää generics kummalla tyylillä he haluavat.,

Delphi ja Free Pascal esimerkki:

Toiminnallinen languagesEdit

Genericity vuonna HaskellEdit

tyyppi luokan mekanismi Haskell tukee geneerinen ohjelmointi.Kuusi ennalta tyyppi luokat Haskell (mukaan lukien Eq, tyypit, joka voi olla verrattuna tasa-arvon, ja Näyttää, tyypit, joiden arvot voivat olla suoritettu kuin jouset) on erityinen ominaisuus tukea johdettu tapauksissa., Tämä tarkoittaa sitä, että ohjelmoija määritellään uusi tyyppi voi todeta, että tämä tyyppi on esimerkiksi yksi näistä erityinen luokat, antamatta toteutukset luokan menetelmiä kuten on yleensä tarpeen, kun julistaa luokan tapauksissa. Kaikki tarvittavat menetelmät ovat ”johdettuja” – eli konstruoidaan automaattisesti-tyypin rakenteen perusteella.,Esimerkiksi, seuraavan julistuksen tyyppi binary puita todetaan, että se on esimerkiksi luokat Eq: n ja Ssa:

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

Tämä johtaa tasa-toiminto (==) ja merkkijono edustus-toiminto (näyttää) on automaattisesti määritelty tahansa muodossa BinTree T edellyttäen, että T itse tukee näiden toimintaa.,

tukea johdettu tapauksia Eq ja Näyttää tekee niiden menetelmiä == ja näyttää yleinen laadullisesti eri tavalla kuin para-metrically polymorfiset funktiot: nämä ”toiminnot” (tarkemmin, tyyppi-indeksoitu perheiden toiminnot) voidaan soveltaa arvot erilaisia, ja vaikka ne käyttäytyvät eri tavalla jokaisen argumentin tyyppi, vähän työtä tarvitaan lisää tukea uuden tyypin. Ralf Hinze (2004) on osoittanut, että samanlainen vaikutus voidaan saavuttaa käyttäjän määrittämä tyyppi luokat tiettyjen ohjelmointi tekniikoita., Muut tutkijat ovat ehdottaneet lähestymistapoja tämä ja muita erilaisia genericity yhteydessä Haskell ja laajennukset Haskell (käsitellään jäljempänä).

PolyPEdit

Polyyppi oli ensimmäinen yleinen ohjelmointikieli laajennus Haskell. Polypissa geneerisiä funktioita kutsutaan polytypisiksi. Kieli otetaan käyttöön erityinen konstruktio, jossa tällainen polytypic toiminnot voidaan määritellä kautta rakenteellinen induktio yli rakenne kuvio functor säännöllinen tietotyyppi. Säännölliset tietotyypit polypissa ovat Haskell-tietotyyppien osajoukko., Säännöllinen tietotyyppi t on oltava sellainen * → *, ja jos on muodollinen tyyppi argumentti määritelmä, niin kaikki rekursiokutsua t on muotoa t a. Nämä rajoitukset sulje pois korkeampi-kinded tietotyypit sekä sisäkkäiset tietotyypit, jossa rekursiokutsua ovat eri muodossa.Flatten-toiminto Polyyppi on täällä tarjotaan esimerkkinä:

Geneeristen HaskellEdit

Generic Haskell on toinen laajennus Haskell, kehittäneet Utrechtin Yliopistossa Alankomaissa., Laajennuksia, joita se tarjoaa, ovat:

  • Tyyppi-indeksoidut arvot on määritelty arvon indeksoitu yli eri Haskell tyyppi rakentajien (yksikkö, alkukantaiset tyypit, summat, tuotteet ja käyttäjän määrittämä tyyppi rakentajien). Lisäksi, voimme myös määrittää käyttäytymistä tyyppi-indeksoidut arvot tietyn rakentajan käyttäen rakentajan tapauksissa, ja uudelleenkäyttö yksi yleinen määritelmä toisessa käyttäen oletuksena tapauksissa.

tuloksena oleva tyyppi-indeksoitu arvo voidaan erikoistua mihin tahansa tyyppiin.

  • Kind-indexed-tyypit ovat tyyppejä, jotka on indeksoitu lajeihin, määritelty antamalla tapaus sekä * että k → k’., Instanssit saadaan soveltamalla lajiin indeksoitua tyyppiä.
  • yleisiä määritelmiä voidaan käyttää soveltamalla niitä tyyppiin tai lajiin. Tätä kutsutaan yleiseksi sovellukseksi. Tuloksena on Tyyppi tai arvo, riippuen siitä, millaista yleistä määritelmää käytetään.
  • Yleinen abstraktio mahdollistaa generic määritelmät määritellään abstrahoimalla tyyppi parametri (tietyn sellainen).
  • Tyyppi-indeksoidut tyypit ovat tyyppejä, jotka indeksoidaan tyyppirakentajien päälle. Näitä voidaan käyttää tyyppien antamiseen enemmän mukana oleville geneerisille arvoille., Tuloksena olevat type-indeksoidut tyypit voidaan erikoistua mihin tahansa tyyppiin.

Kuten esimerkiksi tasa-toiminto Generic Haskell:

CleanEdit

Puhdista tarjoaa geneerinen ohjelmointi perustuu Polyyppi ja generic Haskell tukemia GHC>=6.0. Se parametrizes laatuaan kuin ne, mutta tarjoaa ylikuormitusta.

Muut languagesEdit

ML perheen ohjelmointikielet tukevat geneerinen ohjelmointi kautta parametrinen polymorfismi ja yleisiä moduuleja kutsutaan functors.,Sekä Standard ML että OCaml tarjoavat funktoreita, jotka muistuttavat luokkamalleja ja Ada: n geneerisiä paketteja. Järjestelmän syntaktinen abstraktioita myös yhteys genericity – nämä ovat itse asiassa pääjoukko sivupohjamoottori à la C++.

Verilog-moduuli voi ottaa yhden tai useampia parametreja, johon niiden todelliset arvot on määritetty, kun toteutuksen moduuli. Yksi esimerkki on yleinen rekisteriryhmä, jossa array leveys annetaan parametrin kautta., Tällainen array yhdistettynä geneeriseen lankavektoriin voi tehdä geneerisen puskurin tai muistimoduulin, jolla on mielivaltaisen bittileveys yhdestä moduulin toteutuksesta.

Ada: sta johdetulla VHDL: llä on myös geneerisiä ominaisuuksia.