Кіріспе

Функцияны тек бір аргументті қабылдайтын етіп түрлендіру – математикалық әдіс. Математика және компьютерлік ғылымда, кәрілеу (currying) – бірнеше аргументтерді қабылдайтын функцияны функциялар отбасының тізбегіне түрлендіру әдісі, мұнда әрбір функция бір аргументті қабылдайды. Типик мысалда, қандайда бір функция екі аргументті қабылдайды, біреуін A жиынынан, екіншісін B жиынынан алып, C жиынындағы объектілерді шығарады. Осы функцияның кәріленген түрі бірінші аргументті параметр ретінде қарастырады, соның арқасында функциялар отбасы құрылады. Отбасы осылай ұйымдастырылған, әрбір A жиынындағы объект үшін дәл бір функция бар.

Бұл мысалда, функция өзі функцияға айналады, ол A жиынынан аргументті қабылдап, B жиынынан C жиынына шартайтын функцияны қайтарады. Мұны жазудың дұрыс белгісі көлемді болады. Функция функциялар жиынына жатады. Сондай-ақ, функция функциялар жиынына жатады. Осылайша, A-дан C-ға шартайтын нәрсе – түрі болады. Бұл белгімен, функция бірінші жиынтықтағы объектілерді қабылдап, екінші жиынтықтағы объектілерді қайтарады, сондықтан оны былай жазуға болады. Бұл біршама бейресми мысал; «объект» және «функция» дегеннің нақты анықтамалары төменде келтірілген. Бұл анықтамалар контекстке байланысты өзгереді және қолданылып отырған теорияға қарай әртүрлі формада болады. Кәрілеу ішінара қолданумен (partial application) байланысты, бірақ одан өзгеше. Оны Мұса Шонфинкель жасап, Хаскелл Карри одан әрі дамытқан. Кәрілеуге кері түрлендіру (uncurrying) – оның қос әрекеті, оны функционалдылықтан шығарудың бір түрі ретінде қарастыруға болады. Бұл қайтарым мәні басқа функция болатын функцияны қабылдап, екі функцияның – A және B аргументтерін параметрлер ретінде қабылдайтын жаңа функцияны шығарады, нәтижесінде A функциясын, содан кейін B функциясын осы аргументтерге қолданады. Бұл процесс қайталана береді.

Мотивация

Currying бірнеше аргументтерді қабылдайтын функциялармен жұмыс істеудің және оларды функциялардың бір ғана аргумент қабылдауы мүмкін болатын аяларда пайдаланудың бір жолын ұсынады. Мысалы, кейбір талдау техникаларын тек бір аргументі бар функцияларға ғана қолдануға болады. Көптеген практикалық функциялар одан да көп аргументтерді қабылдайды. Фреге бір аргументті жағдайда шешімдер табу жеткілікті екенін көрсетті, себебі көп аргументтері бар функцияны бір аргументті функциялар тізбегіне түрлендіруге болады. Бұл түрлендіру процесі қазір currying деп аталады. Математикалық талдау немесе компьютерлік бағдарламалауда кездесетін барлық "қалыпты" функцияларды currying жасауға болады. Дегенмен, currying мүмкін емес жағдайлар да бар; currying-ке рұқсат беретін ең жалпы санаттар – жабық моноидалдық санаттар. Кейбір бағдарламалау тілдері бірнеше аргументтерді алу үшін дерлік әрқашан currying функцияларын қолданады; ML және Haskell нақты мысалдар, екі жағдайда да барлық функциялардың дәл бір аргументі бар. Бұл қасиет көп аргументті функциялар көбінесе currying түрінде ұсынылатын лямбда-есептеуден (lambda calculus) мұраға алынған. Currying ішінара қолданумен байланысты, бірақ одан өзгеше. "Schönfinkelisation" деген балама атау ұсынылған. Математикалық контексте принципті 1893 жылы Фреге жасаған жұмыстарға қана қолдануға болады. Бірақ бұл ұғым және Curry жоғары ретті функциялар контекстінде айтылса да, "currying" сөзі жазбаларда кездеспейді және Curry бұл ұғыммен байланысты емес. Одан әрі жағдайлар да бар. Бір пайдалы салдары – функция үздіксіз, егер және тек қана оның currying түрі үздіксіз болса. Тағы бір маңызды нәтиже – әдетте осы контексте "бағалау" деп аталатын қосымша картасы үздіксіз болады (компьютер ғылымында бағалау мүлдем басқа ұғым екенін ескеріңіз). Яғни, компакт ашық және жергілікті үйлесімді Hausdorff болғанда үздіксіз. Бұл екі нәтиже гомотопияның үздіксіздігін орнату үшін орталық болып табылады, яғни бірлік аралығы болғанда, сондықтан оны функцияларының гомотопиясы немесе эквивалентті түрде арасындағы жалғыз (үздіксіз) жол ретінде қарастыруға болады.

Алгебралық топология

Алгебралық топологияда, кэринг Экманн-Хилтон дуалдығының мысалы болып табылады және осылайша, түрлі жағдайларда маңызды рөл атқарады. Мысалы, циклдік кеңістік қысқартылған тоғысуларға қосақтас; бұл жиі былай жазылады:

мұнда – карталардың гомотопиялық кластарының жиыны, – А-ның тоғысуы, ал – А-ның циклдік кеңістігі. Негізінде, тоғысуды бірлік интервалымен эквиваленттік қатынас арқылы интервалды циклге айналдырудың декарт көбейтіндісі ретінде қарастыруға болады. Содан кейін кэрингтелген форма кеңістікті циклдардан функциялар кеңістігіне, яғни –тан Скотт үздіксіз функцияларына бейнелейді. Скотт үздіксіз функциялары алғаш рет лямбда-есептеу үшін семантика беру мақсатымен зерттелді (қалыпты жиын теориясы мұны істеуге жеткіліксіз). Жалпы алғанда, Скотт үздіксіз функциялары қазір домен теориясында зерттеледі, ол компьютерлік алгоритмдердің денотациялық семантикасын қамтиды. Скотт топологиясы топологиялық кеңістіктер санатында кездесетін көптеген таралған топологиялардан өте ерекше екенін ескеріңіз; Скотт топологиясы көбінесе жіңірек және тұрақты емес. Ұғымдықтың үздіксіздігі гомотопиялық типтер теориясында пайда болады, онда екі компьютерлік бағдарлама гомотопиялық деп есептелуі мүмкін, яғни бірдей нәтижелерді есептейді, егер оларды бірінен екіншісіне «үздіксіз» түрде қайта құруға болады.

Ламбда калькулі

Теориялық компьютерлік ғылымда, карринг бірнеше аргументтері бар функцияларды, функциялар тек бір аргумент қабылдайтын өте қарапайым теориялық модельдерде, мысалы, лямбда-есептеуде зерттеуге мүмкіндік береді. Екі аргумент қабылдайтын және түрі болатын функцияны қарастырайық, мұнда x-тің түрі , y-тің түрі болуы керек және функцияның өзі түрін қайтарады. f функциясының каррингтелген түрі былай анықталады:

мұндағы – лямбда-есептеудің абстракторы. Карринг типті функцияларды кіріс ретінде қабылдайтындықтан, каррингтің өзінің түрі екендігіне келеміз. → операторы көбінесе оң жақтың ассоциативтілігі ретінде қарастырылады, сондықтан каррингтелген функцияның түрі жиі былай жазылады: . Керісінше, функцияны қолдану сол жақтың ассоциативтілігі ретінде қарастырылады, сондықтан еквівалентті болады.

Яғни, қолдану ретін нақтылау үшін жақшалар қажет емес. Каррингтелген функцияларды жабылуларды қолдайтын кез келген бағдарламалау тілінде қолдануға болады; алайда, тиімділік үшін каррингтелмеген функциялар көбінесе артықшылыққа ие, өйткені көптеген функцияларды шақыру үшін ішінара қолдану және жабылу құрудың қосымша шығындарынан аулақ болуға болады.

Тип теориясы

Типтер теориясында компьютер ғылымындағы типтік жүйе туралы жалпы идея типтердің нақты алгебрасына формалдастырылады. Мысалы, жазу кезінде , мақсаты – және типтер екендігі, ал жебе – типтік конструктор, нақтырақ айтқанда, функция типі немесе жебе типі. Сол сияқты, типтердің декарттық көбейтіндісі көбейту типтік конструкторы арқылы құрастырылады.

Типтік теориялық тәсіл ML және одан туындаған немесе одан шабыттанған тілдерде қолданылады: CaML, Haskell және F#. Типтік теориялық тәсіл, төменде талқыланғандай, категория теориясының тілін табиғи түрде толықтырады. Өйткені категориялар, әсіресе моноидтік категориялар, ішкі тілге ие, ал қарапайым терілген лямбда-есептеу мұндай тілдің ең көрнекті мысалы болып табылады. Бұл контексте маңызды, себебі оны бір типтік конструктордан – жебе типінен құрастыруға болады. Содан кейін карринг тілге табиғи көбейту типін береді. Категориялардағы объектілер мен типтер арасындағы сәйкестік бағдарламалау тілдерін логика ретінде (Карри-Ховард сәйкестігі арқылы) және математикалық жүйелердің басқа түрлері ретінде қайта қарастыруға мүмкіндік береді, бұл туралы төменде тағы қарастырылады.

Логика

Curry–Howard сәйкестігіне сәйкес, currying және uncurrying-тің болуы логикалық теоремаға баламалы, себебі түплдер (көбейтінді түрі) логикада конъюнкцияға, ал функция түрі импликацияға сәйкес келеді. Гейтинг алгебралары санатындағы экспоненциалдық объект әдетте материалдық импликация ретінде жазылады. Бөлістік Гейтинг алгебралары Буль алгебралары болып табылады, және экспоненциалдық объект нақты түрде жазылады, осылайша экспоненциалдық объектінің шын мәнінде материалдық импликация екені анық көрінеді.

Функцияны ішінара қолданумен контраст

Карринг және ішінара функция қолдану жиі шатастырылады. Екеуінің арасындағы маңызды айырмашылық – ішінара қолданылған функцияны шақыру бірден нәтижені қайтарады, карринг тізбегіндегі келесі функцияны емес. Бұл айырмашылықты екіден артық аргументі бар функциялар үшін нақты көрсетуге болады. Типі бар функция берілгенде, карринг оны шығарады. Яғни, бірінші функцияның бағалануы ретінде көрсетілсе, каррингтелген функцияның бағалануы ретінде көрсетіледі, әрбір аргумент кезекпен алдыңғы шақырудан қайтарылған бір аргументті қабылдайтын функцияға қолданылады. Есімізде болсын, шақырылғаннан кейін, біз бір аргументті қабылдайтын және басқа функцияны қайтаратын функциямен қаламыз, екі аргументті қабылдайтын функциямен емес. Керісінше, ішінара функция қолдану – функцияға бірнеше аргументтерді бекіту процесі, нәтижесінде кішірек аргументі бар функция шығады. Жоғарыдағы анықтаманы ескере отырып, біз бірінші аргументті бекіте (немесе «байлай») аламыз, нәтижесінде типті функция шығады. Интуитивті тұрғыдан алғанда, ішінара функция қолдану «егер функцияның бірінші аргументін бекітсеңіз, қалған аргументтерге қатысты функция аласыз» дейді. Мысалы, егер div функциясы x/y бөлу операциясын білдірсе, онда x параметрі 1-ге бекітілген (яғни, div 1) div басқа функция болады: inv функциясы сияқты, ол өзінің аргументінің кері шамасын қайтарады, inv(y) = 1/y деп анықталған. Ішінара қолданудың практикалық себебі – функцияның барлық аргументтерін емес, тек кейбіреуін бергенде алынған функциялардың пайдалы болуы. Мысалы, көптеген тілдерде «бірге қосу» сияқты функция немесе оператор бар. Ішінара қолдану мұндай функцияларды оңай анықтауға мүмкіндік береді, мысалы, қосу операторын 1-ге байланысты бірінші аргумент ретінде көрсететін функция құру арқылы. Ішінара қолдануды каррингтелген функцияны белгілі бір нүктеде бағалау ретінде қарастыруға болады, мысалы, берілген және содан кейін немесе жай ғана , мұнда карринг f-тің бірінші параметрін бекітеді. Осылайша, ішінара қолдану белгілі бір нүктеде каррингтелген функцияға дейін тоғытылады. Сонымен қатар, белгілі бір нүктедегі каррингтелген функция (тривиальды түрде) ішінара қолдану болып табылады. Қосымша дәлел ретінде, кез келген функция үшін функцияны былай анықтауға болады. Осылайша, кез келген ішінара қолдануды бір карринг операциясына дейін тоғытуға болады. Осылайша, карринг көбінесе теориялық жағдайларда рекурсивті қолданылады, бірақ теориялық тұрғыдан (операция ретінде қарастырылғанда) ішінара қолданудан ажыратылмайтын операция ретінде анықталады. Сондықтан, ішінара қолдануды кейбір функцияның кірістерінің белгілі бір реті бойынша карринг операторының бір рет қолдануының объективті нәтижесі ретінде анықтауға болады.