Osittainen soveltaminen
Täyttäkää funktion argumentteja etukäteen.
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.
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
- Funktiot arvoina
- map, filter, reduce
- Osittainen soveltaminen
- Funktioiden koostaminen