Type inference ( eng. type inference ) - ohjelmoinnissa kääntäjän kyky päätellä loogisesti itse lausekkeen arvon tyyppi . Tyyppipäättelymekanismi otettiin ensimmäisen kerran käyttöön ML -kielessä , jossa kääntäjä päättelee aina yleisimmän polymorfisen tyypin mille tahansa lausekkeelle. Tämä ei ainoastaan vähennä lähdekoodin kokoa ja lisää sen tiiviyttä, vaan lisää usein koodin uudelleenkäyttöä [1] .
Tyyppipäättely on ominaista toiminnallisille ohjelmointikielille , vaikka se on ajan myötä osittain toteutettu oliokielillä ( C# , D , Visual Basic .NET , Nim , C++11 , Vala , Java [a] ), missä se rajoittuu kykyyn jättää pois tunnisteen tyyppi määritelmästä alustuksen yhteydessä (katso syntaktinen sokeri ). Esimerkiksi:
var s = "Hei, maailma!" ; // Muuttujan s (merkkijonosta) tyyppi johdetaan alustuksestaHindley-Milner-algoritmi on lauseketyyppinen päättelymekanismi, joka on toteutettu Hindley-Milner-tyyppiseen järjestelmään perustuvissa ohjelmointikielissä , kuten ML (tämän perheen ensimmäinen kieli), Standard ML , OCaml , Haskell , F# , Fortress ja Boo . Nemerlen kieli käyttää tätä algoritmia useilla tarvittavilla muutoksilla [2] .
Tyyppipäätelmämekanismi perustuu kykyyn päätellä automaattisesti, kokonaan tai osittain, jonkin lausekkeen arvioimalla saadun lausekkeen tyyppi. Koska tämä prosessi suoritetaan systemaattisesti ohjelman käännöksen aikana, kääntäjä voi usein päätellä muuttujan tai funktion tyypin määrittelemättä nimenomaisesti näiden objektien tyyppejä. Monissa tapauksissa eksplisiittiset tyyppiilmoitukset voidaan jättää pois - tämä voidaan tehdä melko yksinkertaisille objekteille tai kielille, joilla on yksinkertainen syntaksi. Esimerkiksi Haskell-kielellä on varsin tehokas tyyppipäättelymekanismi, joten tässä ohjelmointikielessä ei ole tarpeen määritellä funktiotyyppejä. Ohjelmoija voi määrittää funktion tyypin nimenomaisesti rajoittaakseen sen käytön tiettyihin tietotyyppeihin tai jäsennellympään lähdekoodin muotoiluun.
Saadakseen tietoa lausekkeen tyypin oikeasta päättelystä ilman nimenomaista ilmoitusta tämän lausekkeen tyypistä kääntäjä joko kerää tällaiset tiedot sisällytettyjen alilauseketyyppien (muuttujat, funktiot) eksplisiittisistä ilmoituksista. tutkitussa lausekkeessa tai käyttää implisiittistä tietoa atomiarvojen tyypeistä. Tällainen algoritmi ei aina auta määrittämään lausekkeen tyyppiä, etenkään tapauksissa, joissa käytetään korkeamman asteen funktioita ja melko monimutkaista parametrista polymorfismia . Siksi monimutkaisissa tapauksissa, kun on tarpeen välttää epäselvyyksiä, on suositeltavaa määrittää selkeästi lausekkeiden tyyppi.
Tyypitysmalli itsessään perustuu lauseketyypin päättelyalgoritmiin, jonka lähteenä on H. Curryn ja R. Facen vuonna 1958 ehdottamassa tyypitetyssä λ-laskennassa käytetty lauseketyypin johtamismekanismi. Lisäksi Roger Hindley vuonna 1969 laajensi itse algoritmia ja osoitti, että se johtaa yleisimmän ilmaisutyypin. Vuonna 1978 Robin Milner todisti R. Hindleystä riippumatta vastaavan algoritmin ominaisuudet. Ja lopuksi, vuonna 1985 , Louis Damas vihdoin osoitti, että Milnerin algoritmi on valmis ja sitä voidaan käyttää polymorfisille tyypeille. Tässä suhteessa Hindley-Milner-algoritmia kutsutaan joskus myös Damas-Milner-algoritmiksi .
Tyyppijärjestelmä on määritelty Hindley-Milner-mallissa seuraavasti:
Lausekkeet, joiden tyypit arvioidaan, määritellään melko tavallisella tavalla:
Tyypin sanotaan olevan tyypin esiintymä, kun tapahtuu muunnos , joka:
Tässä tapauksessa oletetaan yleensä, että tyyppimuunnoksilla on rajoituksia, joita ovat seuraavat:
Tyyppipäättelyalgoritmi itsessään koostuu kahdesta vaiheesta - yhtälöjärjestelmän muodostamisesta ja näiden yhtälöiden myöhemmästä ratkaisusta.
Yhtälöjärjestelmän rakentaminenYhtälöjärjestelmän rakentaminen perustuu seuraaviin sääntöihin:
Näissä säännöissä symboli on joukko assosiaatioita muuttujien ja niiden tyyppien välillä:
Yhtälöjärjestelmän ratkaiseminen
Rakennetun yhtälöjärjestelmän ratkaisu perustuu yhdistämisalgoritmiin . Tämä on melko yksinkertainen algoritmi. On olemassa funktio , joka ottaa syötteeksi tyyppiyhtälön ja palauttaa korvauksen, joka tekee yhtälön vasemmasta ja oikeasta puolesta saman ("yhdistää" ne). Substituutio on yksinkertaisesti muuttujatyyppien projektio itse tyypeille. Sellaiset substituutiot voidaan laskea eri tavoilla, jotka riippuvat Hindley-Milner-algoritmin erityisestä toteutuksesta.