Toiminnanpoisto

Defunctionalisointi ohjelmoinnissa  on tekniikka ohjelman muuntamiseksi käännöshetkellä , korvaamalla korkeamman asteen funktiot kutsulla yhdelle funktiolle, jossa käytetään funktiota argumenttiin.

John Reynolds kuvasi sen ensimmäisen kerran vuonna 1972 [ 1] .  Koska mikä tahansa ohjelma sisältää rajallisen määrän funktionaalisia abstraktioita, jokainen niistä voidaan korvata yksilöllisellä tunnisteella ja jokainen abstraktin funktion sovellus sellaisessa ohjelmassa voidaan korvata sovellusfunktion funktiokutsulla abstraktin tunnisteella. toimii ensimmäisenä parametrina. Tässä tapauksessa sovellusfunktio valitsee operaatiot abstraktin funktion tunnisteen perusteella ja suorittaa ne muille argumenteille (abstraktin funktion alkuperäisille argumenteille).

Yksi tämän tekniikan vaikeus on se, että funktionaalinen abstraktio voi viitata vapaisiin muuttujiin . Tällaisessa tilanteessa λ-lifting  — vapaiden muuttujien muunnos sulkemisiksi — on suoritettava ennen defunktionalisoinnin suorittamista , jotta mikä tahansa funktionaalisen abstraktion käyttämä vapaa muuttuja välitettäisiin argumenttina sovellusfunktiolle. Lisäksi, jos huuhtelua tuetaan ensimmäisen luokan arvona , on luotava uusia tietorakenteita edustamaan siepattuja arvoja.

Sen sijaan, että käytettäisiin yhtä sovellustoimintoa käsittelemään kaikkia tapauksia, voidaan käyttää erilaisia ​​ohjausvuon analysointitekniikoita (mukaan lukien yksinkertainen ero erilaisten arityjen (argumenttien lukumäärä) tai tyyppiallekirjoitusten välillä) sovelluksen erottamiseen useiksi erikoistoiminnoiksi. Ohjelmointikieli voi myös tukea toimintoosoittimia , jotka voivat olla tehokkaampia kuin lähetysmenetelmä.

Sen lisäksi, että defunktionalisointia käytetään funktionaalisten ohjelmointikielten kääntäjissä, joissa käytetään korkeamman asteen funktioita, sitä on tutkittu myös menetelmänä tulkin mekaaniseksi muuttamiseksi abstraktiksi koneeksi . Defunktionalisointi liittyy myös funktioiden esittämiseen funktioobjekteilla olioohjelmoinnissa ( vaihtoehtona sulkemisten käytölle).

Esimerkki

Puutietotyypille [ 2 ] :

data Puu a = Lehti a | Solmu ( Puu a ) ( Puu a )

seuraava ohjelma on poistettu käytöstä:

miinukset :: a -> [ a ] ​​​​-> [ a ] ​​miinukset x xs = x : xs o :: ( b -> c ) -> ( a -> b ) -> a -> c o f g x = f ( g x ) litistä :: Puu t -> [ t ] litistä t = kävellä t [] kävellä :: Puu t -> [ t ] -> [ t ] kävellä ( Lehti x ) = miinukset x kävely ( Solmu t1 t2 ) = o ( kävellä t1 ) ( kävely t2 )

Tätä varten kaikki korkeamman asteen funktiot ( cons, o, ja walk) korvataan arvolla, jonka tyyppi on Lam, ja suoran funktiokutsun sijaan käytetään funktiota, applyjoka käsittelee tämän tyyppisiä arvoja:

tiedot Lam a = LamCons a | LamO ( Lam a ) ( Lam a ) soveltaa :: Lam a -> [ a ] ​​​​-> [ a ] ​​· soveltaa ( LamCons x ) xs = x : xs soveltaa ( LamO f1 f2 ) xs = soveltaa f1 ( soveltaa f2 xs ) cons_def :: a -> Lam a cons_def x = LamCons x o_def :: Lam a -> Lam a -> Lam a o_def f1 f2 = LamO f1 f2 flatten_def :: Puu t -> [ t ] flatten_def t = käytä ( walk_def t ) [] walk_def :: Puu t -> Lam t walk_def ( Lehti x ) = cons_def x walk_def ( Solmu t1 t2 ) = o_def ( walk_def t1 ) ( walk_def t2 )

Muistiinpanot

  1. Reynolds, 1972 .
  2. Oliver Dunveyn esimerkki käännettynä Haskellille

Kirjallisuus

Linkit