Кіріспе
Функционалдық бағдарламалаудағы жалпы типтерді құруға арналған жобалау үлгісі – категория теориясындағы ұғым. Функционалдық бағдарламалауда монад – бағдарлама фрагменттерін (функцияларды) біріктіретін және олардың қайтарым мәндерін қосымша есептеулермен типке орайтын құрылым. Монадтар орамалы монад түрін анықтаумен қатар, екі операторды анықтайды: біреуі монад түріндегі мәнді орауға, екіншісі монад түрінің мәндерін шығаратын функцияларды біріктіруге арналған (бұлар монадтық функциялар деп аталады). Жалпы мақсаттағы тілдер монадтарды жиі қолданылатын операциялар үшін қажетті шаблондық кодты азайту үшін пайдаланады (мысалы, анықталмаған мәндермен немесе қателік тудыруы мүмкін функциялармен жұмыс істеу, немесе есепке алу кодын капсулалау). Функционалдық тілдер монадтарды функциялардың күрделі тізбектерін басқару ағыны мен жанама әсерлерді абстракциялайтын ықшам құбырларға айналдыру үшін қолданады. Монадтың түсінігі де, термин де бастапқыда категория теориясынан келген, онда монад – қосымша құрылымы бар функтор ретінде анықталады. efn| Бұл мақалада сипатталған монадтар, бағдарламалауда көптеген еркін айнымалылары бар функциялардың кең таралғандығына байланысты, техникалық тұрғыдан алғанда категория теориялықтары «мықты монадтар» деп атайды. Монадтар есептеу түрі үшін семантиканы нақтылайтындықтан, оларды ыңғайлы тілдік мүмкіндіктерді жүзеге асыру үшін де қолдануға болады. Кейбір тілдер, мысалы Хаскелл, тіпті өздерінің негізгі кітапханаларында жалпы монадтық құрылым мен оның жалпы мысалдары үшін алдын ала анықталған нұсқауларды ұсынады.
the concept in category theory
In functional programming, a monad is a structure that combines program fragments (functions) and wraps their return values in a type with additional computation. In addition to defining a wrapping monadic type, monads define two operators: one to wrap a value in the monad type, and another to compose together functions that output values of the monad type (these are known as monadic functions). General purpose languages use monads to reduce boilerplate code needed for common operations (such as dealing with undefined values or fallible functions, or encapsulating bookkeeping code). Functional languages use monads to turn complicated sequences of functions into succinct pipelines that abstract away control flow, and side effects. Both the concept of a monad and the term originally come from category theory, where a monad is defined as a functor with additional structure. efn|Due to the fact that functions on multiple free variables are common in programming, monads as described in this article are technically what category theorists would call strong monads. Since monads make semantics explicit for a kind of computation, they can also be used to implement convenient language features. Some languages, such as Haskell, even offer pre built definitions in their core libraries for the general monad structure and common instances.
Тарих
"Монад" термині бағдарламалауда шын мәнінде APL және J бағдарламалау тілдеріне дейін жетеді, олар көбінесе таза функционалдық болып келеді. Дегенмен, осы тілдерде "монад" бір параметрді қабылдайтын функцияның қысқаша белгісі ғана (екі параметрлі функция "диада" деп аталады, және т.с.с.). Математик Роджер Годемент 1950-ші жылдардың соңында монад тұжырымдамасын (оны "стандартты құрылым" деп атады) алғаш рет формулирледі, бірақ "монад" терминін категориялық теоретик Сондерс Мак Лейн танымал етті. Бірақ, байлау арқылы жоғарыда анықталған форма 1965 жылы математик Генрих Клейсли тарапынан кез келген монадты екі (ковариантты) функтор арасындағы қосымша ретінде сипаттауға болатынын дәлелдеу үшін сипатталды. 1980-ші жылдардан бастап компьютерлік ғылым қауымдастығында монад үлгісі туралы шамалы түсінік пайда бола бастады. Бағдарламалау тілдерін зерттеуші Филипп Уэдлердің сөзіне сәйкес, компьютер ғалымы Джон К. Рейнольдс 1970-ші және 1980-ші жылдардың басында оның бірнеше аспектілерін болжады, ол жалғастыру стилі, категориялық теорияның формальды семантиканың бай көзі ретінде және мәндер мен есептеулер арасындағы типтік айырмашылықтар туралы талқылады. Компьютер ғалымы Эухенио Могги 1989 жылы конференциялық мақалада категориялық теорияның монадын функционалдық бағдарламалаумен тікелей байланыстырған алғашқы адам болды, содан кейін 1991 жылы журналға жақсартылған нұсқасын ұсынды. Алдыңғы жұмыста бірнеше компьютер ғалымдары категориялық теорияны қолданып, лямбда-есептеудің семантикасын қамтамасыз етуге ұмтылды. Моггидің маңызды түсінігі – нақты әлемдегі бағдарлама тек мәндерден басқа мәндерге функция емес, керісінше, осы мәндердегі есептеулерді құрайтын трансформация. Категориялық теориялық тұрғысынан формалдағанда, бұл монадтар осы есептеулерді ұсыну құрылымы деген қорытындыға әкеледі. Хаскелл қауымдастығы функционалдық бағдарламалаудағы көптеген мәселелерге монадтарды қолданды, ал 2010-шы жылдары Хаскеллпен жұмыс істейтін зерттеушілер монадтар қолданбалы функторлар екенін анықтады; сондай-ақ, монадтар мен жебелер – моноїдтар екенін мойындады. Бастапқыда монадтарды қолдану негізінен Хаскеллге және оның туындыларына ғана шектелген, бірақ функционалдық бағдарламалау басқа парадигмаларға әсер еткендіктен, көптеген тілдер монад үлгісін қабылдады (атымен болмаса, мағынасында). Қазіргі уақытта Scheme, Perl, Python, Racket, Clojure, Scala, F# тілдерінде формулировкалар бар, сондай-ақ жаңа ML стандарты үшін де қарастырылып жатыр.
Талдау
Монадалық үлгінің бір артықшылығы – есептеулерді құрастыруға математикалық нақтылық әкелуі. Монада заңдары инстанцияның дұрыстығын тексеру үшін ғана емес, сонымен қатар туыс құрылымдардың (мысалы, функторлар) мүмкіндіктерін қолдануға, түрлендіру арқылы мүмкіндік береді.
Жалғастыру монодасы
Оқырман Макканнның талқылауын қадағалауды қалайды. Алгебралық тұрғыдан, екі (коммутативті емес) моноидтің арақатынасы жартылай сақинаға ұқсас, және кейбір қосымша монадтар осыған сай келеді. Дегенмен, барлық қосымша монадтар тіпті жартылай сақинаның да тарату заңдарын қанағаттандырмайды. Басқалары оларды тілде итераторларды ұсыну сияқты, динамикалық, операциялық мәселелерге де қолданды.