Кіріспе
Функцияны тек бір аргументті қабылдайтын етіп түрлендіру – математикалық әдіс. Математика және компьютерлік ғылымда, кәрілеу (currying) – бірнеше аргументтерді қабылдайтын функцияны функциялар отбасының тізбегіне түрлендіру әдісі, мұнда әрбір функция бір аргументті қабылдайды. Типик мысалда, қандайда бір функция екі аргументті қабылдайды, біреуін A жиынынан, екіншісін B жиынынан алып, C жиынындағы объектілерді шығарады. Осы функцияның кәріленген түрі бірінші аргументті параметр ретінде қарастырады, соның арқасында функциялар отбасы құрылады. Отбасы осылай ұйымдастырылған, әрбір A жиынындағы объект үшін дәл бір функция бар.
the mathematical technique
In mathematics and computer science, currying is the technique of translating a function that takes multiple arguments into a sequence of families of functions, each taking a single argument. In the prototypical example, one begins with a function that takes two arguments, one from and one from and produces objects in The curried form of this function treats the first argument as a parameter, so as to create a family of functions The family is arranged so that for each object in there is exactly one function
Бұл мысалда, функция өзі функцияға айналады, ол A жиынынан аргументті қабылдап, B жиынынан C жиынына шартайтын функцияны қайтарады. Мұны жазудың дұрыс белгісі көлемді болады. Функция функциялар жиынына жатады. Сондай-ақ, функция функциялар жиынына жатады. Осылайша, A-дан C-ға шартайтын нәрсе – түрі болады. Бұл белгімен, функция бірінші жиынтықтағы объектілерді қабылдап, екінші жиынтықтағы объектілерді қайтарады, сондықтан оны былай жазуға болады. Бұл біршама бейресми мысал; «объект» және «функция» дегеннің нақты анықтамалары төменде келтірілген. Бұл анықтамалар контекстке байланысты өзгереді және қолданылып отырған теорияға қарай әртүрлі формада болады. Кәрілеу ішінара қолданумен (partial application) байланысты, бірақ одан өзгеше. Оны Мұса Шонфинкель жасап, Хаскелл Карри одан әрі дамытқан. Кәрілеуге кері түрлендіру (uncurrying) – оның қос әрекеті, оны функционалдылықтан шығарудың бір түрі ретінде қарастыруға болады. Бұл қайтарым мәні басқа функция болатын функцияны қабылдап, екі функцияның – A және B аргументтерін параметрлер ретінде қабылдайтын жаңа функцияны шығарады, нәтижесінде A функциясын, содан кейін B функциясын осы аргументтерге қолданады. Бұл процесс қайталана береді.
and further developed by Haskell Curry. Uncurrying is the dual transformation to currying, and can be seen as a form of defunctionalization. It takes a function whose return value is another function , and yields a new function that takes as parameters the arguments for both and , and returns, as a result, the application of and subsequently, , to those arguments. The process can be iterated.
Мотивация
Currying бірнеше аргументтерді қабылдайтын функциялармен жұмыс істеудің және оларды функциялардың бір ғана аргумент қабылдауы мүмкін болатын аяларда пайдаланудың бір жолын ұсынады. Мысалы, кейбір талдау техникаларын тек бір аргументі бар функцияларға ғана қолдануға болады. Көптеген практикалық функциялар одан да көп аргументтерді қабылдайды. Фреге бір аргументті жағдайда шешімдер табу жеткілікті екенін көрсетті, себебі көп аргументтері бар функцияны бір аргументті функциялар тізбегіне түрлендіруге болады. Бұл түрлендіру процесі қазір currying деп аталады. Математикалық талдау немесе компьютерлік бағдарламалауда кездесетін барлық "қалыпты" функцияларды currying жасауға болады. Дегенмен, currying мүмкін емес жағдайлар да бар; currying-ке рұқсат беретін ең жалпы санаттар – жабық моноидалдық санаттар. Кейбір бағдарламалау тілдері бірнеше аргументтерді алу үшін дерлік әрқашан currying функцияларын қолданады; ML және Haskell нақты мысалдар, екі жағдайда да барлық функциялардың дәл бір аргументі бар. Бұл қасиет көп аргументті функциялар көбінесе currying түрінде ұсынылатын лямбда-есептеуден (lambda calculus) мұраға алынған. Currying ішінара қолданумен байланысты, бірақ одан өзгеше. "Schönfinkelisation" деген балама атау ұсынылған. Математикалық контексте принципті 1893 жылы Фреге жасаған жұмыстарға қана қолдануға болады. Бірақ бұл ұғым және Curry жоғары ретті функциялар контекстінде айтылса да, "currying" сөзі жазбаларда кездеспейді және Curry бұл ұғыммен байланысты емес. Одан әрі жағдайлар да бар. Бір пайдалы салдары – функция үздіксіз, егер және тек қана оның currying түрі үздіксіз болса. Тағы бір маңызды нәтиже – әдетте осы контексте "бағалау" деп аталатын қосымша картасы үздіксіз болады (компьютер ғылымында бағалау мүлдем басқа ұғым екенін ескеріңіз). Яғни, компакт ашық және жергілікті үйлесімді Hausdorff болғанда үздіксіз. Бұл екі нәтиже гомотопияның үздіксіздігін орнату үшін орталық болып табылады, яғни бірлік аралығы болғанда, сондықтан оны функцияларының гомотопиясы немесе эквивалентті түрде арасындағы жалғыз (үздіксіз) жол ретінде қарастыруға болады.
is continuous when is compact open and locally compact Hausdorff. These two results are central for establishing the continuity of homotopy, i. e. when is the unit interval , so that can be thought of as either a homotopy of two functions from to , or, equivalently, a single (continuous) path in .
Алгебралық топология
Алгебралық топологияда, кэринг Экманн-Хилтон дуалдығының мысалы болып табылады және осылайша, түрлі жағдайларда маңызды рөл атқарады. Мысалы, циклдік кеңістік қысқартылған тоғысуларға қосақтас; бұл жиі былай жазылады:
мұнда – карталардың гомотопиялық кластарының жиыны, – А-ның тоғысуы, ал – А-ның циклдік кеңістігі. Негізінде, тоғысуды бірлік интервалымен эквиваленттік қатынас арқылы интервалды циклге айналдырудың декарт көбейтіндісі ретінде қарастыруға болады. Содан кейін кэрингтелген форма кеңістікті циклдардан функциялар кеңістігіне, яғни –тан Скотт үздіксіз функцияларына бейнелейді. Скотт үздіксіз функциялары алғаш рет лямбда-есептеу үшін семантика беру мақсатымен зерттелді (қалыпты жиын теориясы мұны істеуге жеткіліксіз). Жалпы алғанда, Скотт үздіксіз функциялары қазір домен теориясында зерттеледі, ол компьютерлік алгоритмдердің денотациялық семантикасын қамтиды. Скотт топологиясы топологиялық кеңістіктер санатында кездесетін көптеген таралған топологиялардан өте ерекше екенін ескеріңіз; Скотт топологиясы көбінесе жіңірек және тұрақты емес. Ұғымдықтың үздіксіздігі гомотопиялық типтер теориясында пайда болады, онда екі компьютерлік бағдарлама гомотопиялық деп есептелуі мүмкін, яғни бірдей нәтижелерді есептейді, егер оларды бірінен екіншісіне «үздіксіз» түрде қайта құруға болады.
Ламбда калькулі
Теориялық компьютерлік ғылымда, карринг бірнеше аргументтері бар функцияларды, функциялар тек бір аргумент қабылдайтын өте қарапайым теориялық модельдерде, мысалы, лямбда-есептеуде зерттеуге мүмкіндік береді. Екі аргумент қабылдайтын және түрі болатын функцияны қарастырайық, мұнда x-тің түрі , y-тің түрі болуы керек және функцияның өзі түрін қайтарады. f функциясының каррингтелген түрі былай анықталады:
where is the abstractor of lambda calculus. Since curry takes, as input, functions with the type , one concludes that the type of curry itself is
The → operator is often considered right associative, so the curried function type is often written as Conversely, function application is considered to be left associative, so that is equivalent to
That is, the parenthesis are not required to disambiguate the order of the application. Curried functions may be used in any programming language that supports closures; however, uncurried functions are generally preferred for efficiency reasons, since the overhead of partial application and closure creation can then be avoided for most function calls.
мұндағы – лямбда-есептеудің абстракторы. Карринг типті функцияларды кіріс ретінде қабылдайтындықтан, каррингтің өзінің түрі екендігіне келеміз. → операторы көбінесе оң жақтың ассоциативтілігі ретінде қарастырылады, сондықтан каррингтелген функцияның түрі жиі былай жазылады: . Керісінше, функцияны қолдану сол жақтың ассоциативтілігі ретінде қарастырылады, сондықтан еквівалентті болады.
where is the abstractor of lambda calculus. Since curry takes, as input, functions with the type , one concludes that the type of curry itself is
The → operator is often considered right associative, so the curried function type is often written as Conversely, function application is considered to be left associative, so that is equivalent to
That is, the parenthesis are not required to disambiguate the order of the application. Curried functions may be used in any programming language that supports closures; however, uncurried functions are generally preferred for efficiency reasons, since the overhead of partial application and closure creation can then be avoided for most function calls.
Яғни, қолдану ретін нақтылау үшін жақшалар қажет емес. Каррингтелген функцияларды жабылуларды қолдайтын кез келген бағдарламалау тілінде қолдануға болады; алайда, тиімділік үшін каррингтелмеген функциялар көбінесе артықшылыққа ие, өйткені көптеген функцияларды шақыру үшін ішінара қолдану және жабылу құрудың қосымша шығындарынан аулақ болуға болады.
where is the abstractor of lambda calculus. Since curry takes, as input, functions with the type , one concludes that the type of curry itself is
The → operator is often considered right associative, so the curried function type is often written as Conversely, function application is considered to be left associative, so that is equivalent to
That is, the parenthesis are not required to disambiguate the order of the application. Curried functions may be used in any programming language that supports closures; however, uncurried functions are generally preferred for efficiency reasons, since the overhead of partial application and closure creation can then be avoided for most function calls.
Тип теориясы
Типтер теориясында компьютер ғылымындағы типтік жүйе туралы жалпы идея типтердің нақты алгебрасына формалдастырылады. Мысалы, жазу кезінде , мақсаты – және типтер екендігі, ал жебе – типтік конструктор, нақтырақ айтқанда, функция типі немесе жебе типі. Сол сияқты, типтердің декарттық көбейтіндісі көбейту типтік конструкторы арқылы құрастырылады.
The type theoretical approach is expressed in programming languages such as ML and the languages derived from and inspired by it: CaML, Haskell and F#. The type theoretical approach provides a natural complement to the language of category theory, as discussed below. This is because categories, and specifically, monoidal categories, have an internal language, with simply typed lambda calculus being the most prominent example of such a language. It is important in this context, because it can be built from a single type constructor, the arrow type. Currying then endows the language with a natural product type. The correspondence between objects in categories and types then allows programming languages to be re interpreted as logics (via Curry–Howard correspondence), and as other types of mathematical systems, as explored further, below.
Типтік теориялық тәсіл ML және одан туындаған немесе одан шабыттанған тілдерде қолданылады: CaML, Haskell және F#. Типтік теориялық тәсіл, төменде талқыланғандай, категория теориясының тілін табиғи түрде толықтырады. Өйткені категориялар, әсіресе моноидтік категориялар, ішкі тілге ие, ал қарапайым терілген лямбда-есептеу мұндай тілдің ең көрнекті мысалы болып табылады. Бұл контексте маңызды, себебі оны бір типтік конструктордан – жебе типінен құрастыруға болады. Содан кейін карринг тілге табиғи көбейту типін береді. Категориялардағы объектілер мен типтер арасындағы сәйкестік бағдарламалау тілдерін логика ретінде (Карри-Ховард сәйкестігі арқылы) және математикалық жүйелердің басқа түрлері ретінде қайта қарастыруға мүмкіндік береді, бұл туралы төменде тағы қарастырылады.
The type theoretical approach is expressed in programming languages such as ML and the languages derived from and inspired by it: CaML, Haskell and F#. The type theoretical approach provides a natural complement to the language of category theory, as discussed below. This is because categories, and specifically, monoidal categories, have an internal language, with simply typed lambda calculus being the most prominent example of such a language. It is important in this context, because it can be built from a single type constructor, the arrow type. Currying then endows the language with a natural product type. The correspondence between objects in categories and types then allows programming languages to be re interpreted as logics (via Curry–Howard correspondence), and as other types of mathematical systems, as explored further, below.
Логика
Curry–Howard сәйкестігіне сәйкес, currying және uncurrying-тің болуы логикалық теоремаға баламалы, себебі түплдер (көбейтінді түрі) логикада конъюнкцияға, ал функция түрі импликацияға сәйкес келеді. Гейтинг алгебралары санатындағы экспоненциалдық объект әдетте материалдық импликация ретінде жазылады. Бөлістік Гейтинг алгебралары Буль алгебралары болып табылады, және экспоненциалдық объект нақты түрде жазылады, осылайша экспоненциалдық объектінің шын мәнінде материалдық импликация екені анық көрінеді.
Функцияны ішінара қолданумен контраст
Карринг және ішінара функция қолдану жиі шатастырылады. Екеуінің арасындағы маңызды айырмашылық – ішінара қолданылған функцияны шақыру бірден нәтижені қайтарады, карринг тізбегіндегі келесі функцияны емес. Бұл айырмашылықты екіден артық аргументі бар функциялар үшін нақты көрсетуге болады. Типі бар функция берілгенде, карринг оны шығарады. Яғни, бірінші функцияның бағалануы ретінде көрсетілсе, каррингтелген функцияның бағалануы ретінде көрсетіледі, әрбір аргумент кезекпен алдыңғы шақырудан қайтарылған бір аргументті қабылдайтын функцияға қолданылады. Есімізде болсын, шақырылғаннан кейін, біз бір аргументті қабылдайтын және басқа функцияны қайтаратын функциямен қаламыз, екі аргументті қабылдайтын функциямен емес. Керісінше, ішінара функция қолдану – функцияға бірнеше аргументтерді бекіту процесі, нәтижесінде кішірек аргументі бар функция шығады. Жоғарыдағы анықтаманы ескере отырып, біз бірінші аргументті бекіте (немесе «байлай») аламыз, нәтижесінде типті функция шығады. Интуитивті тұрғыдан алғанда, ішінара функция қолдану «егер функцияның бірінші аргументін бекітсеңіз, қалған аргументтерге қатысты функция аласыз» дейді. Мысалы, егер div функциясы x/y бөлу операциясын білдірсе, онда x параметрі 1-ге бекітілген (яғни, div 1) div басқа функция болады: inv функциясы сияқты, ол өзінің аргументінің кері шамасын қайтарады, inv(y) = 1/y деп анықталған. Ішінара қолданудың практикалық себебі – функцияның барлық аргументтерін емес, тек кейбіреуін бергенде алынған функциялардың пайдалы болуы. Мысалы, көптеген тілдерде «бірге қосу» сияқты функция немесе оператор бар. Ішінара қолдану мұндай функцияларды оңай анықтауға мүмкіндік береді, мысалы, қосу операторын 1-ге байланысты бірінші аргумент ретінде көрсететін функция құру арқылы. Ішінара қолдануды каррингтелген функцияны белгілі бір нүктеде бағалау ретінде қарастыруға болады, мысалы, берілген және содан кейін немесе жай ғана , мұнда карринг f-тің бірінші параметрін бекітеді. Осылайша, ішінара қолдану белгілі бір нүктеде каррингтелген функцияға дейін тоғытылады. Сонымен қатар, белгілі бір нүктедегі каррингтелген функция (тривиальды түрде) ішінара қолдану болып табылады. Қосымша дәлел ретінде, кез келген функция үшін функцияны былай анықтауға болады. Осылайша, кез келген ішінара қолдануды бір карринг операциясына дейін тоғытуға болады. Осылайша, карринг көбінесе теориялық жағдайларда рекурсивті қолданылады, бірақ теориялық тұрғыдан (операция ретінде қарастырылғанда) ішінара қолданудан ажыратылмайтын операция ретінде анықталады. Сондықтан, ішінара қолдануды кейбір функцияның кірістерінің белгілі бір реті бойынша карринг операторының бір рет қолдануының объективті нәтижесі ретінде анықтауға болады.