Каррування або каррінг (англ. currying) в інформатиці — метод обчислення функції від багатьох аргументів, перетворенням її в послідовність функцій одного аргумента. Це перетворення було введено Мойсеєм Шейнфінкелем і отримало свою назву від свого поширювача, Гаскеля Каррі.
Операція каррування є функцією вищого порядку, оскільки, вона приймає і повертає функцію.
Карровані функції можуть використовуватись у всіх мовах програмування, що підтримують замикання. Хоча не карровані функції обчислюються швидше, оскільки не потребують часткового застосування та створення замикання.
Визначення
Для функції двох змінних , каррування — це операція .
Тобто, має аргумент і повертає функцію однієї змінної .
Часткове застосування функції
Каррування — це не є зменшення кількості аргументів функції за допомогою їх фіксації, це побудова послідовності функцій одного аргумента, кожна з яких повертає наступну.
Для функції , каррування — це послідовність функцій .
Знаходження значення функції — це , а при обчисленні значення каррованої функції , для кожного аргумента, при його підстановці отримуємо нову функцію, в яку підставляємо наступний аргумент і т. д.
Тобто, , повертає функцію одного аргумента (яка в свою чергу теж повертає функцію), а не функцію двох аргументів.
Математична точка зору
В теоретичній інформатиці є такий аналітичний апарат, як лямбда-числення, який можна застосувати тільки для функцій однієї змінної. З точки зору теорії множин, каррування — це відповідність між множинами та …
Приклади
#include<functional> auto curry = ([](int x)->std::function<int(int)>{ return [x](int y)->int { return x+y; }; }); int a = curry(4)(5); // 9 auto curry_4 = curry(4); int b = curry_4(5); // 9
C# (3.0)
Func<int, Func<int, int>> curry = (x => (y => x + y)); curry(4)(5); // 9
Curry = fun(A) -> fun(B) -> A + B end end. (Curry(3))(4). % => 7
let add a b = a + b //'a -> 'a -> 'a let addOne = add 1 //'a -> 'a let x = addOne 10 // 11
(defun curry(x) (lambda (y) (+ x y))) ((curry 2) 3) ; повертає 5 ; через особливості семантики вертає помилку (на відміну від Scheme)... (funcall (curry 2) 3) ; повертає 5
curry x = (\y -> x + y) -- також можна написати curry = (+) curry 2 3 -- повертає 5
! curry - turn a binary function into a function producing a function. !(Named after Haskell B. Curry) ! e.g. curry f x y = f(x, y) dec curry : (alpha # beta -> gamma) -> alpha -> beta -> gamma; --- curry f <= lambda x => lambda y => f(x, y); curry (+) 1; >> lambda y => 1 + y: num->num (curry (+) 1) 2; >>3: num
function curry(x){ return function(y){ return x + y; } } curry(4)(5); // повертає 9
Починаючи з версії ECMAScript 5 можливий код:
const curry = (fn,x) => (y) => fn(x,y); const add = (x,y) => x+y; curry(add,4)(5); // повертає 9
Lisp Scheme
; визначення (define (curry x) (lambda (y) (+ x y))) ; виклик (let ((curr (curry 4))) (curr 5)) ;результат 9 ; або так ((curry 4) 5)
let curry x = function y -> x + y;; (* val curry : int -> int -> int = <fun> *) let a = curry 4 5;; (* - : int = 9 *)
OCaml є мовою із сімейства ML, в мовах цього сімейства приведення багатомісної функції в карроване представлення виконується автоматично:
let curry x y = x + y;; (* val curry : int -> int -> int = <fun> *) let a = curry 4;; (* val a : int -> int = <fun> *) a 5;; (* - : int = 9 *)
curry = lambda fn, x: lambda y: fn(x, y) add = lambda x, y: x + y curry(add, 4)(5) # => 9
sub curry { my $x = shift; return sub { return $x + shift } } curry(4)->(5); # 9
Починаючи з PHP 5.3, в якому було додано замикання.
function curry($x) { return function ($y) use ($x) { return $x + $y; }; } $a = curry(5); $b = $a(10); // 15
def curry(x) Proc.new{|y| x + y} end curry(1).call(2) # => 3
def curry(x: Int)(y: Int) = x + y // curry: (Int)(Int)Int f = curry(4)_ f(5) // Int = 9
Приклад реалізації з використанням блоків (blocks):
typedef int (^Add)(int y); Add curry(int x) { return Block_copy(^(int y) { return x + y; }); } int res = curry(5)(6); NSLog(@"%i",res); >>11
package main func main() { curry := func(x int) func(int) int { return func(y int) int { return x+y } } print(curry(2)(3)) // 5 }
curry = @(x)@(y)x+y; a = curry(5); disp(a(6)); % 11
F = {(Y) = {(X)=X+Y}}, write(F(2)(3)), % 5
t(A, B):- A > B, !. call(call(t, 3), 0). % true
Див. також
Примітки
- . Архів оригіналу за 7 жовтня 2014. Процитовано 3 жовтня 2014.
Ця стаття потребує додаткових для поліпшення її . (квітень 2020) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Karruvannya abo karring angl currying v informatici metod obchislennya funkciyi vid bagatoh argumentiv peretvorennyam yiyi v poslidovnist funkcij odnogo argumenta Ce peretvorennya bulo vvedeno Mojseyem Shejnfinkelem i otrimalo svoyu nazvu vid svogo poshiryuvacha Gaskelya Karri Operaciya karruvannya ye funkciyeyu vishogo poryadku oskilki vona prijmaye i povertaye funkciyu Karrovani funkciyi mozhut vikoristovuvatis u vsih movah programuvannya sho pidtrimuyut zamikannya Hocha ne karrovani funkciyi obchislyuyutsya shvidshe oskilki ne potrebuyut chastkovogo zastosuvannya ta stvorennya zamikannya ViznachennyaDlya funkciyi dvoh zminnih f X Y Z displaystyle scriptstyle f colon X times Y to Z karruvannya ce operaciya curry f X Y Z displaystyle scriptstyle text curry f colon X to Y to Z Tobto curry f displaystyle scriptstyle text curry f maye argument X displaystyle scriptstyle X i povertaye funkciyu odniyeyi zminnoyi Y Z displaystyle scriptstyle Y to Z Chastkove zastosuvannya funkciyiKarruvannya ce ne ye zmenshennya kilkosti argumentiv funkciyi za dopomogoyu yih fiksaciyi ce pobudova poslidovnosti funkcij odnogo argumenta kozhna z yakih povertaye nastupnu Dlya funkciyi f X Y Z N displaystyle scriptstyle f colon X times Y times Z to N karruvannya ce poslidovnist funkcij curry f X Y Z N displaystyle scriptstyle text curry f colon X to Y to Z to N Znahodzhennya znachennya funkciyi ce f 1 2 3 displaystyle scriptstyle f 1 2 3 a pri obchislenni znachennya karrovanoyi funkciyi f curried 1 2 3 displaystyle scriptstyle f text curried 1 2 3 dlya kozhnogo argumenta pri jogo pidstanovci otrimuyemo novu funkciyu v yaku pidstavlyayemo nastupnij argument i t d Tobto f curried 1 displaystyle scriptstyle f text curried 1 povertaye funkciyu odnogo argumenta yaka v svoyu chergu tezh povertaye funkciyu a ne funkciyu dvoh argumentiv Matematichna tochka zoruV teoretichnij informatici ye takij analitichnij aparat yak lyambda chislennya yakij mozhna zastosuvati tilki dlya funkcij odniyeyi zminnoyi Z tochki zoru teoriyi mnozhin karruvannya ce vidpovidnist mizh mnozhinami C A B displaystyle scriptstyle C A times B ta C B A displaystyle scriptstyle left C B right A PrikladiC 11 include lt functional gt auto curry int x gt std function lt int int gt return x int y gt int return x y int a curry 4 5 9 auto curry 4 curry 4 int b curry 4 5 9 C 3 0 Func lt int Func lt int int gt gt curry x gt y gt x y curry 4 5 9 Erlang Curry fun A gt fun B gt A B end end Curry 3 4 gt 7 F let add a b a b a gt a gt a let addOne add 1 a gt a let x addOne 10 11 Common Lisp defun curry x lambda y x y curry 2 3 povertaye 5 cherez osoblivosti semantiki vertaye pomilku na vidminu vid Scheme funcall curry 2 3 povertaye 5 Haskell curry x y gt x y takozh mozhna napisati curry curry 2 3 povertaye 5 curry turn a binary function into a function producing a function Named after Haskell B Curry e g curry f x y f x y dec curry alpha beta gt gamma gt alpha gt beta gt gamma curry f lt lambda x gt lambda y gt f x y curry 1 gt gt lambda y gt 1 y num gt num curry 1 2 gt gt 3 num JavaScript function curry x return function y return x y curry 4 5 povertaye 9 Pochinayuchi z versiyi ECMAScript 5 mozhlivij kod const curry fn x gt y gt fn x y const add x y gt x y curry add 4 5 povertaye 9 Lisp Scheme viznachennya define curry x lambda y x y viklik let curr curry 4 curr 5 rezultat 9 abo tak curry 4 5 OCaml let curry x function y gt x y val curry int gt int gt int lt fun gt let a curry 4 5 int 9 OCaml ye movoyu iz simejstva ML v movah cogo simejstva privedennya bagatomisnoyi funkciyi v karrovane predstavlennya vikonuyetsya avtomatichno let curry x y x y val curry int gt int gt int lt fun gt let a curry 4 val a int gt int lt fun gt a 5 int 9 Python curry lambda fn x lambda y fn x y add lambda x y x y curry add 4 5 gt 9 Perl sub curry my x shift return sub return x shift curry 4 gt 5 9 PHP Pochinayuchi z PHP 5 3 v yakomu bulo dodano zamikannya function curry x return function y use x return x y a curry 5 b a 10 15 Ruby def curry x Proc new y x y end curry 1 call 2 gt 3 Scala def curry x Int y Int x y curry Int Int Int f curry 4 f 5 Int 9 Objective C Priklad realizaciyi z vikoristannyam blokiv blocks typedef int Add int y Add curry int x return Block copy int y return x y int res curry 5 6 NSLog i res gt gt 11 Go package main func main curry func x int func int int return func y int int return x y print curry 2 3 5 MATLAB curry x y x y a curry 5 disp a 6 11 F Y X X Y write F 2 3 5 t A B A gt B call call t 3 0 trueDiv takozhLinivi obchislennyaPrimitki Arhiv originalu za 7 zhovtnya 2014 Procitovano 3 zhovtnya 2014 Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno kviten 2020