torstai 26. helmikuuta 2009

Luento 14 - Parametripolymorfismi

Parametripolymorfismi on eräs Cardellin ja Wegnerin määritelmän kategorioista. Se on määritelty seuraavasti: "Parametric Polymorphism: a polymorphic function has an implicit or explicit type parameter which determines the type of the argument for each application of that function." Oleellista määritelmässä on tyyppiparametrin käsite. Sen avulla voidaan siis määritellä aliohjelman tyyppi. Huomaa, että dynaamisesti tyypitetyissä kielissä tämän voidaan ajatella tapahtuvan implisiittisesti. Staattisesti tyypitetyissä kielissä tyyppiparametri tulee määritellä eksplisiittisesti.

Parametrinen polymorfismi mahdollistaa geneerisemmän koodin kirjoittamisen. Tämä onkin eräs tapa, jolla staattisesti tyypitetyt kielet matkivat dynaamisesti tyypitettyjä. Geneerisen koodin ansiosta voidaan sitä voidaan ajatella abstraktimmalla tasolla.

Tyypitetyn lambda-kielen tapauksessa parametrista polymorfismia voidaan toteuttaa käyttäen ns. Systeemi F -laajennosta, joka luo tyypeille sopivan abstraktion. Käsittääkseni tässä on oleellisesti kyse siitä, että Systeemi F mahdollistaa tyyppien käsittelyn omassa avaruudessaan ja se toteuttaa rajapinnan, jonka avulla se liittyy vanhaan määritelmään.

Systeemi F ei toimi tyyppitoimituksilla (tyyppitasolla toimiva funktio, esim. lista), joten sitä on laajennettu edelleen. Tätä laajennosta kutsutaan nimellä Systeemi F (pikku omega). Tyyppitoimituksia varten tyypeille tulee määritellä tyypit eli luonteet (kinds). Tämä johtunee siitä, että Systeemi F:n tyypit ja tyyppitoimitukset voidaan samaistaa olevan samassa tyyppiavaruudessa.

Luennolla esiteltiin myös varsin mielenkiintoinen foldr (fold right) operaatio, joka tunnetaan myös reduce nimellä. Pythonissa operaatiota voidaan käyttää esim. seuraavasti: reduce(lambda x, y: x*y, [1, 2, 3, 4]). Tässä tapauksessa listan sisältämät luvut kerrotaan keskenään. Tarkemman kuvauksen löydät täältä.

1 kommentti:

  1. Systeemi F laajennuksineen oli sinänsä varsin mielenkiintoinen tuttavuus. Lisäksi tuo luennolla läpi käyty foldr (reduce) osoittautui erittäin päteväksi (tälle löytyy käyttöä käytännössä).

    VastaaPoista