Lua Academy · Oppitunti

Osittainen soveltaminen

Täyttäkää funktion argumentteja etukäteen.

Oppitunti 3/413 vaihetta

Osittainen soveltaminen on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä partial application tarkoittaa

Partial application tarkoittaa, että osa funktion argumenteista määritetään nyt ja loput annetaan myöhemmin. Tulokseksi saadaan uusi funktio, joka tarvitsee vähemmän argumentteja.

Näin yleiskäyttöisestä funktiosta voi tehdä erikoistuneen lukitsemalla jo tiedossa olevat arvot paikoilleen.

Manuaalinen esimerkki

Oletetaan, että käytettävissä on add-funktio. Voitte rakentaa addFive-funktion kirjoittamalla sulkeuman, joka sieppaa arvon 5 ja odottaa toista lukua.

Siepattu arvo säilyy palautetussa funktiossa, joten jokaisella kutsulla tarvitaan enää vain jäljellä oleva argumentti.

local function add(a, b)
  return a + b
end

local function addFive(b)
  return add(5, b)
end

print(addFive(10))
print(addFive(2))

Ensimmäisen argumentin sitominen

Voimme yleistää tämän toimintamallin. bind1-apuohjelma ottaa funktion ja kiinteän ensimmäisen argumentin ja palauttaa uuden funktion, joka odottaa toista argumenttia.

Sulkeuma sieppaa sekä f-funktion että lukitun arvon ja välittää ne kaikki eteenpäin kutsun yhteydessä.

local function bind1(f, a)
  return function(b)
    return f(a, b)
  end
end

local function mul(x, y) return x * y end
local double = bind1(mul, 2)
print(double(7))
print(double(50))

Varargien käyttäminen

Jos haluatte kiinnittää mielivaltaisen määrän ensimmäisiä argumentteja, käyttäkää LuAn vararg-syntaksia .... Siepatkaa kiinteät argumentit ja lisätkää myöhemmin annetut argumentit kutsuhetkellä.

table.pack- ja table.unpack-funktiot auttavat argumenttilistojen tallentamisessa ja levittämisessä.

local function partial(f, ...)
  local fixed = table.pack(...)
  return function(...)
    local rest = table.pack(...)
    local args = {}
    for i = 1, fixed.n do args[i] = fixed[i] end
    for i = 1, rest.n do args[fixed.n + i] = rest[i] end
    return f(table.unpack(args, 1, fixed.n + rest.n))
  end
end

local function add3(a, b, c) return a + b + c end
local add10 = partial(add3, 10)
print(add10(2, 3))

Usean argumentin kiinnittäminen

Koska partial hyväksyy vaihtuvan määrän argumentteja, voit kiinnittää useamman kuin yhden argumentin kerralla. Palautettu funktio tarvitsee silloin vain jäljellä olevat argumentit.

Tässä kolme argumenttia käsittävästä funktiosta kaksi argumenttia täytetään etukäteen, joten jäljelle jää yhden argumentin funktio.

local function partial(f, ...)
  local fixed = table.pack(...)
  return function(...)
    local rest = table.pack(...)
    local args = {}
    for i = 1, fixed.n do args[i] = fixed[i] end
    for i = 1, rest.n do args[fixed.n + i] = rest[i] end
    return f(table.unpack(args, 1, fixed.n + rest.n))
  end
end

local function label(prefix, sep, value) return prefix .. sep .. value end
local tag = partial(label, "id", ":")
print(tag(42))

Käytännön käyttötapaus

Osittainen soveltaminen on erityisen hyödyllistä yleiskäyttöisten apufunktioiden kanssa. Määritä asetukset kerran ja käytä sitten erikoistunutta funktiota yhä uudelleen.

Alla yleiskäyttöisestä greet-funktiosta tehdään kiinteän kielen tervehdysfunktio, joka tarvitsee enää vain nimen.

local function greet(lang, name)
  if lang == "tr" then return "Merhaba, " .. name end
  return "Hello, " .. name
end

local function bind1(f, a) return function(b) return f(a, b) end end
local greetTr = bind1(greet, "tr")
print(greetTr("Ada"))
print(greetTr("Lin"))

Osittainen soveltaminen ja currying

Currying muuttaa useita argumentteja hyväksyvän funktion peräkkäisten yhden argumentin funktioiden ketjuksi, jossa kukin funktio palauttaa seuraavan. Osittainen soveltaminen vain kiinnittää jotkin argumentit ja jättää loput tavallisen kutsun käsiteltäviksi.

Menetelmät liittyvät toisiinsa, mutta ovat eri asioita: currying käsittelee argumentit yksi kerrallaan, kun taas osittaisessa soveltamisessa osa argumenteista kiinnitetään heti.

local function curryAdd(a)
  return function(b)
    return function(c)
      return a + b + c
    end
  end
end

print(curryAdd(1)(2)(3))

Kahden argumentin funktion currying

Pieni apufunktio voi tehdä minkä tahansa kahden argumentin funktion curryingin automaattisesti. Se palauttaa ensimmäisen argumentin funktion, joka puolestaan palauttaa toisen argumentin funktion.

Näin saadaan uudelleenkäytettäviä yhden argumentin rakentajia, jotka sopivat hyvin putkistoihin.

local function curry2(f)
  return function(a)
    return function(b)
      return f(a, b)
    end
  end
end

local function pow(base, exp) return base ^ exp end
local cpow = curry2(pow)
print(cpow(2)(10))

Sulkeumat mahdollistavat tämän

Jokainen osittain sovellettu ja curried-funktio perustuu sulkeumiin. Kiinnitetyt argumentit ovat talteen otettuja paikallisia muuttujia, jotka palautettu funktio muistaa.

Koska jokaisella palautetulla funktiolla on omat talteen otetut arvonsa, voit luoda turvallisesti useita erikoistuneita muunnelmia.

local function bind1(f, a) return function(b) return f(a, b) end end
local function sub(x, y) return x - y end

local from100 = bind1(sub, 100)
local from10 = bind1(sub, 10)
print(from100(40))
print(from10(3))

Milloin sitä kannattaa käyttää

Käyttäkää osittaista soveltamista toiston vähentämiseen, kun kutsutte funktiota jatkuvasti samoilla ensimmäisillä argumenteilla.

Se auttaa myös sovittamaan funktion rajapintaan, joka odottaa vähemmän argumentteja, kuten callback-funktioon, jolle välitetään vain yksi arvo.

Määritetyt callback-funktiot

Osittainen soveltaminen sopii hyvin yhteen map- ja filter-funktioiden kanssa. Voit täyttää asetukset sisältävän argumentin etukäteen, jolloin callback-funktio saa vain listan alkion.

Näin putkisto pysyy selkeänä, mutta sen toimintaa voi silti säätää.

local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function bind1(f, a) return function(b) return f(a, b) end end
local function scale(factor, x) return factor * x end

local r = map({1,2,3,4}, bind1(scale, 10))
print(table.concat(r, ", "))

Pikatarkistus

Palauttakaa mieleenne ero näiden kahden toisiinsa liittyvän käsitteen välillä.

Kertaus

Osittainen soveltaminen kiinnittää jotkin argumentit ja palauttaa uuden funktion, joka odottaa loput argumentit. Tämä toteutetaan sulkeumilla, jotka tallentavat kiinnitetyt arvot.

Vaihtuvaan määrään argumentteja perustuva partial-apufunktio yleistää tämän, kun taas currying muodostaa yhden argumentin funktioiden ketjun. Molemmat vähentävät toistoa ja sovittavat funktioita callback-funktioihin.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Osittainen soveltaminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Osittainen soveltaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Osittainen soveltaminen”?

Täyttäkää funktion argumentteja etukäteen. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Osittainen soveltaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Funktiot arvoina
  2. map, filter, reduce
  3. Osittainen soveltaminen
  4. Funktioiden koostaminen
← Takaisin: Lua Academy