Кіріспе

Функционалдық бағдарламалаудағы жалпы типтерді құруға арналған жобалау үлгісі – категория теориясындағы ұғым. Функционалдық бағдарламалауда монад – бағдарлама фрагменттерін (функцияларды) біріктіретін және олардың қайтарым мәндерін қосымша есептеулермен типке орайтын құрылым. Монадтар орамалы монад түрін анықтаумен қатар, екі операторды анықтайды: біреуі монад түріндегі мәнді орауға, екіншісі монад түрінің мәндерін шығаратын функцияларды біріктіруге арналған (бұлар монадтық функциялар деп аталады). Жалпы мақсаттағы тілдер монадтарды жиі қолданылатын операциялар үшін қажетті шаблондық кодты азайту үшін пайдаланады (мысалы, анықталмаған мәндермен немесе қателік тудыруы мүмкін функциялармен жұмыс істеу, немесе есепке алу кодын капсулалау). Функционалдық тілдер монадтарды функциялардың күрделі тізбектерін басқару ағыны мен жанама әсерлерді абстракциялайтын ықшам құбырларға айналдыру үшін қолданады. Монадтың түсінігі де, термин де бастапқыда категория теориясынан келген, онда монад – қосымша құрылымы бар функтор ретінде анықталады. efn| Бұл мақалада сипатталған монадтар, бағдарламалауда көптеген еркін айнымалылары бар функциялардың кең таралғандығына байланысты, техникалық тұрғыдан алғанда категория теориялықтары «мықты монадтар» деп атайды. Монадтар есептеу түрі үшін семантиканы нақтылайтындықтан, оларды ыңғайлы тілдік мүмкіндіктерді жүзеге асыру үшін де қолдануға болады. Кейбір тілдер, мысалы Хаскелл, тіпті өздерінің негізгі кітапханаларында жалпы монадтық құрылым мен оның жалпы мысалдары үшін алдын ала анықталған нұсқауларды ұсынады.

Тарих

"Монад" термині бағдарламалауда шын мәнінде APL және J бағдарламалау тілдеріне дейін жетеді, олар көбінесе таза функционалдық болып келеді. Дегенмен, осы тілдерде "монад" бір параметрді қабылдайтын функцияның қысқаша белгісі ғана (екі параметрлі функция "диада" деп аталады, және т.с.с.). Математик Роджер Годемент 1950-ші жылдардың соңында монад тұжырымдамасын (оны "стандартты құрылым" деп атады) алғаш рет формулирледі, бірақ "монад" терминін категориялық теоретик Сондерс Мак Лейн танымал етті. Бірақ, байлау арқылы жоғарыда анықталған форма 1965 жылы математик Генрих Клейсли тарапынан кез келген монадты екі (ковариантты) функтор арасындағы қосымша ретінде сипаттауға болатынын дәлелдеу үшін сипатталды. 1980-ші жылдардан бастап компьютерлік ғылым қауымдастығында монад үлгісі туралы шамалы түсінік пайда бола бастады. Бағдарламалау тілдерін зерттеуші Филипп Уэдлердің сөзіне сәйкес, компьютер ғалымы Джон К. Рейнольдс 1970-ші және 1980-ші жылдардың басында оның бірнеше аспектілерін болжады, ол жалғастыру стилі, категориялық теорияның формальды семантиканың бай көзі ретінде және мәндер мен есептеулер арасындағы типтік айырмашылықтар туралы талқылады. Компьютер ғалымы Эухенио Могги 1989 жылы конференциялық мақалада категориялық теорияның монадын функционалдық бағдарламалаумен тікелей байланыстырған алғашқы адам болды, содан кейін 1991 жылы журналға жақсартылған нұсқасын ұсынды. Алдыңғы жұмыста бірнеше компьютер ғалымдары категориялық теорияны қолданып, лямбда-есептеудің семантикасын қамтамасыз етуге ұмтылды. Моггидің маңызды түсінігі – нақты әлемдегі бағдарлама тек мәндерден басқа мәндерге функция емес, керісінше, осы мәндердегі есептеулерді құрайтын трансформация. Категориялық теориялық тұрғысынан формалдағанда, бұл монадтар осы есептеулерді ұсыну құрылымы деген қорытындыға әкеледі. Хаскелл қауымдастығы функционалдық бағдарламалаудағы көптеген мәселелерге монадтарды қолданды, ал 2010-шы жылдары Хаскеллпен жұмыс істейтін зерттеушілер монадтар қолданбалы функторлар екенін анықтады; сондай-ақ, монадтар мен жебелер – моноїдтар екенін мойындады. Бастапқыда монадтарды қолдану негізінен Хаскеллге және оның туындыларына ғана шектелген, бірақ функционалдық бағдарламалау басқа парадигмаларға әсер еткендіктен, көптеген тілдер монад үлгісін қабылдады (атымен болмаса, мағынасында). Қазіргі уақытта Scheme, Perl, Python, Racket, Clojure, Scala, F# тілдерінде формулировкалар бар, сондай-ақ жаңа ML стандарты үшін де қарастырылып жатыр.

Талдау

Монадалық үлгінің бір артықшылығы – есептеулерді құрастыруға математикалық нақтылық әкелуі. Монада заңдары инстанцияның дұрыстығын тексеру үшін ғана емес, сонымен қатар туыс құрылымдардың (мысалы, функторлар) мүмкіндіктерін қолдануға, түрлендіру арқылы мүмкіндік береді.

Жалғастыру монодасы

Оқырман Макканнның талқылауын қадағалауды қалайды. Алгебралық тұрғыдан, екі (коммутативті емес) моноидтің арақатынасы жартылай сақинаға ұқсас, және кейбір қосымша монадтар осыған сай келеді. Дегенмен, барлық қосымша монадтар тіпті жартылай сақинаның да тарату заңдарын қанағаттандырмайды. Басқалары оларды тілде итераторларды ұсыну сияқты, динамикалық, операциялық мәселелерге де қолданды.