Částečné použití - Partial application
v počítačová věda, částečná aplikace (nebo částečná funkce aplikace) odkazuje na proces opravy řady argumentů k funkci, čímž vzniká další funkce menší arity. Vzhledem k funkci , mohli bychom opravit (nebo „svázat“) první argument a vytvořit funkci typu . Vyhodnocení této funkce může být reprezentováno jako . Všimněte si, že výsledkem aplikace částečné funkce je v tomto případě funkce, která má dva argumenty. Částečná aplikace se někdy nesprávně nazývá kari, což je související, ale odlišný koncept.
Motivace
Aplikace s částečnými funkcemi intuitivně říká „pokud opravíte první argumenty funkce, získáte funkci zbývajících argumentů ". Například if function div (x, y) = X/y, pak div s parametrem X pevně na 1 je další funkce: div1(y) = div (1, y) = 1 / r. To je stejné jako funkce inv která vrací multiplikativní inverzní hodnotu jejího argumentu, definovanou inv(y) = 1/y.
Praktická motivace pro částečné použití spočívá v tom, že velmi často jsou funkce získané dodáním některých, ale ne všech argumentů, užitečné; například mnoho jazyků má podobnou funkci nebo operátor plus_one
. Částečná aplikace usnadňuje definování těchto funkcí, například vytvořením funkce, která představuje operátor sčítání s 1 vázaným jako jeho první argument.
Implementace
V jazycích, jako je ML, Haskell a F#, funkce jsou definovány v kari ve výchozím nastavení. Poskytování méně než celkového počtu argumentů se označuje jako částečná aplikace.
V jazycích s prvotřídní funkce lze definovat kari
, nepřirozený
a papply
explicitně provádět kari a částečnou aplikaci. To může způsobit větší režii za běhu kvůli vytvoření dalších uzávěry, zatímco Haskell může používat efektivnější techniky.[1]
Scala implementuje volitelnou částečnou aplikaci se zástupným symbolem, např. def přidat(X: Int, y: Int) = {X+y}; přidat(1, _: Int)
vrací přírůstkovou funkci. Scala také podporuje více seznamů parametrů jako kari, např. def přidat(X: Int)(y: Int) = {X+y}; přidat(1) _
.
Clojure implementuje částečnou aplikaci pomocí částečný
funkce definovaná v jeho základní knihovně.[2]
The C ++ standardní knihovna poskytuje svázat (funkce, argumenty ..)
vrátit funkční objekt to je výsledek částečné aplikace daných argumentů na danou funkci. Alternativně, výrazy lambda může být použito:
int F(int A, int b);auto f_partial = [](int A) { vrátit se F(A, 123); };tvrdit(f_partial(456) == F(456, 123) );
v Jáva, MethodHandle.bindTo
částečně použije funkci na svůj první argument.[3]Alternativně od verze Java 8 lze použít lambdas:
veřejnost statický <A, B, R> Funkce<B, R> částečné použití(BiFunkce<A, B, R> biFunc, A hodnota) { vrátit se b -> biFunc.aplikovat(hodnota, b);}
v Raku, za předpokladu
metoda vytvoří novou funkci s menším počtem parametrů.[4]
The Krajta standardní knihovní modul functools
zahrnuje částečný
funkce, umožňující vazby pozičních a pojmenovaných argumentů, vrácení nové funkce.[5]
v XQuery, zástupný symbol argumentu (?
) se používá pro každý nefixovaný argument v aplikaci částečných funkcí.[6]
Definice
V jednoduše zadaný lambda kalkul s funkce a typy produktů (λ→,×) částečnou aplikaci, kari a curry lze definovat jako:
papply
- (((A × b) → C) × A) → (b → C) = λ(F, X). λy. F (X, y)
kari
- ((A × b) → C) → (A → (b → C)) = λf. λx. λy. F (X, y)
nepřirozený
- (A → (b → C)) → ((A × b) → C) = λf. λ(X, y). f x y
Všimněte si, že kari
papply
= kari
.
Viz také
Reference
- ^ Marlow & Peyton Jones 2004
- ^ "clojure / clojure, částečná funkce". GitHub. Citováno 2020-07-18.
- ^ „MethodHandle (Java Platform SE 7)“. docs.oracle.com. Citováno 2018-09-12.
- ^ "Metoda za předpokladu". docs.perl6.org. Citováno 2018-09-12.
- ^ "10.2. Functools - funkce a operace vyššího řádu s objekty, které lze volat - dokumentace k Pythonu 3.7.0". docs.python.org. Citováno 2018-09-12.
- ^ „XQuery 3.1: dotazovací jazyk XML“. www.w3.org. Citováno 2018-09-12.
Další čtení
- Simon Marlow a Simon Peyton Jones (2004, 2006). „Rychlá kari: Push / Enter vs. Eval / Použít pro jazyky vyššího řádu“. ICFP '04 Sborník deváté mezinárodní konference ACM SIGPLAN o funkčním programování.
- Benjamin C. Pierce et al. "Částečná aplikace", „Odbočení: Currying“. Softwarové základy.
externí odkazy
- Aplikace částečných funkcí na kód Rosetta.
- Částečné použití na Haskell Wiki
- Konstantní aplikační forma na Haskell Wiki
- Nebezpečí být příliš částečný