Монада (программирование)

Мона́да — особый тип данных в функциональных языках программирования, для которого возможно задать императивную последовательность выполнения некоторых операций над хранимыми значениями[1]. Монады позволяют задавать последовательность выполнения операций, производить операции с побочными эффектами и другие действия, которые сложно или вовсе невозможно реализовать в функциональной парадигме программирования другими способами.

Концепция монады и термин изначально происходят из теории категорий, где она определяется как функтор с дополнительной структурой. Исследования, начатые в конце 1980-х — начале 1990-х годов, установили, что монады могут привнести, казалось бы, разрозненные проблемы компьютерной науки в единую функциональную модель. Теория категорий также выдвигает несколько формальных требований[каких?], так называемых монадических законов, которые должны соблюдаться любой монадой и могут быть использованы для верификации монадического кода.

Описание

Монады чаще всего используются в функциональных языках программирования. При ленивой модели вычисления порядок редукции неизвестен. Например, вычисление 1 + 3 + 6 может быть редуцировано в 1 + 9 или 4 + 6. Монады позволяют упорядочить редукцию. Поэтому существует ироничное утверждение, что монады — это способ перегрузить оператор «точка с запятой».

Монада является контейнером, который хранит в себе значение произвольного типа. Она должна обладать функцией связывания (bind), которая принимает два аргумента: текущее значение монады и функцию, принимающую значение типа, который содержит текущая монада и возвращающая новую монаду. Результатом вызова функции связывания будет новая монада, полученная путём применения первого аргумента ко второму. Так могла бы выглядеть монада в императивном языке Java и одна из её реализаций, контейнер Maybe:

import java.util.function.Function;

interface Monad<T> {
	<U> Monad<U> bind(Function<T, Monad<U>> f);
}

class Maybe<T> implements Monad<T> {

	private final T val;

	public Maybe(T val) {
		this.val = val;
	}

	public T getVal() {
		return val;
	}

	@Override
	public <U> Monad<U> bind(Function<T, Monad<U>> f) {
		if (val == null)
			return new Maybe<U>(null);
		return f.apply(val);
	}
}

public class MonadApp {
	public static void main(String[] args) {
		Maybe<Integer> x = new Maybe<>(5);
		Monad<Integer> y = x
				.bind(v -> new Maybe<>(v + 1))
				.bind(v -> new Maybe<>(v * 2));
		System.out.println( ((Maybe<Integer>)y).getVal() );
	}
}

Появившиеся в Java 8 функциональные интерфейсы позволяют реализовать интерфейс, похожий на монаду.

Класс Monad присутствует в стандартном модуле Prelude. Для реализации данного класса требуется любой однопараметрический тип (тип рода * -> *). Монада обладает четырьмя методами

class Functor f where
  fmap   :: (a -> b) -> f a -> f b

class Functor f => Applicative f where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b
  (*>) :: f a -> f b -> f b
  (<*) :: f a -> f b -> f a

-- m :: * -> *
class Applicative m => Monad m where
  (>>=)  :: m a -> (a -> m b) -> m b 
  (>>)   :: m a -> m b -> m b -- реализован по-умолчанию: a >> b = a >>= \_ -> b
  return :: a -> m a -- = pure
  fail   :: String -> m a -- по-умолчанию вызывает errorWithoutStackTrace

Метод return может ввести в заблуждение программистов, знакомых с императивными языками: он не прерывает вычисления, а лишь упаковывает произвольное значение типа a в монаду m. Метод fail не имеет отношения к теоретической сущности монад, однако используется в случае ошибки сопоставления с образцом внутри монадического вычисления.[2]). Оператор >>= является функцией связывания. Оператор >> — частный случай оператора >>=, используется когда нам не важен результат связывания.

Некоторые типы, реализующие класс Monad:

  • IO, используется для функций с побочным эффектом. Конструкторы IO скрыты от программиста, также отсутствуют функции распаковки монады. Это не позволяет вызывать грязные функции из чистых.
  • Maybe. Вычисление прерывается, если получено значение Nothing.
  • [] (список). Вычисление прерывается при пустом списке. При непустом списке оператор >>= вызывает функцию для каждого элемента списка.
  • Reader.
  • Writer.
  • State. Помимо возможностей Reader позволяет изменять состояние.

В языке также присутствует do-нотация, которая является более удобной формой записи монадических функций. В данном примере f1 использует do-нотацию, а f2 записана с помощью операторов связывания:

f1 = do
  s <- getLine
  putStrLn $ "Hello " ++ s
  putStrLn "Goodbye"
  
f2 = getLine >>=
  (\s -> putStrLn $ "Hello " ++ s) >>
  putStrLn "Goodbye"

Примечания

  1. Душкин-ФП, 2008, с. 215.
  2. Евгений Кирпичев. Монады в Haskell. Архивировано 16 января 2017 года.Монады — «обобщение некоторых привычных идиом, а также как ещё один метод для их абстракции».

Ссылки

Учебные пособия

Другие статьи

Литература

  • Душкин Р.В. Охрана // Приёмы программирования // Функции // Синтаксис и идиомы языка // Справочник по языку Haskell / Гл. ред. Д. А. Мовчан. — М.: ДМК Пресс, 2008. — С. 37—38. — 554 с. — 1500 экз. — ISBN 5-94074-410-9, ББК 32.973.26-018.2, УДК 004.4.
  • Душкин Р. В. Функциональное программирование на языке Haskell. — М.: ДМК Пресс, 2008. — 609 с. — ISBN 5-94074-335-8.
  • Пейтон-Джонс, Саймон. 8. Лекция: Стандартное начало (Prelude) // Язык и библиотеки Haskell 98.
  • Erkok Levent. Value Recursion in Monadic Computations. Oregon Graduate Institute. — 2002. — 162 p.

Read other articles:

Applebee'sJenisAnak perusahaan sepenuhnyaIndustriRestoranDidirikan1 Januari 1980 di Decatur, GeorgiaPendiriBill and T. J. PalmerKantorpusatKansas City, Missouri, Amerika SerikatCabang2010 (2011)TokohkunciJulia Stewart, CEO, DineEquity, Inc.[1]Mike Archer, PresidenPendapatan$1.216 miliar USD (2005)Laba operasi$157.637 juta USD (2005)Laba bersih$101.802 juta USD (2005)Karyawan32260 (2006)IndukDineEquity, Inc.Situs webwww.applebees.com Logo yang digunakan dari 1980–2007, masih dipakai di …

Rafael EitanRafael Eitan, Commander Company A, 4th Battalion, Harel Brigade (1948)Lahir11 January 1929Tempat lahirAfula, Mandate PalestineMeninggal dunia23 Desember 2004(2004-12-23) (umur 75)Faksi yang diwakili di Knesset–Tzomet Rafael Raful Eitan (Ibrani: רפאל רפול איתןcode: he is deprecated )(lahir [11 Januari 1929 – 23 November 2004) adalah seorang jendral Israel, mantan ramatkal Angkatan Pertahanan Israel dan akhirnya menjadi politikus, anggota knesset dan …

Presiden Republik SingapuraBerkas:Singapore Presidental Crest.gifLambang Kepresidenan SingapuraBendera Kepresidenan SingapuraKepala NegaraKediamanThe IstanaDitunjuk olehParlemen (1965–1991)Pemilihan Langsung (1991-present)Masa jabatan6 Tahun; (bisa Periode ke-2)Dasar hukumKonstitusi Singapura, Pasal 17Situs webistana.gov.sgKekuasaan Presiden Singapura bersifat ke arah seremonial dalam menjalankan diskresi kebijakan dan dalam menjalankan kekuasaanya, Presiden harus berkolaborasi atas masukan da…

Private university in St. Louis, Missouri, US Missouri Baptist redirects here. For the hospital, see Missouri Baptist Medical Center. Missouri Baptist UniversityOther nameMOBAPFormer nameSt. Louis Baptist College (1957–1964)Missouri Baptist College (1964–2002)TypePrivateEstablished1957Religious affiliationSouthern Baptist (Missouri Baptist Convention)Endowment$5 million[1]PresidentKeith L. RossProvostAndy ChambersAcademic staff230Students5,309 [2]LocationCreve Coeur, Missouri…

Town of Evening Calm, Country of Cherry Blossoms夕凪の街 桜の国(Yūnagi no machi, Sakura no kuni)GenreSejarah, Drama MangaPengarangFumiyo KōnoPenerbitFutabashaPenerbit bahasa InggrisNA Last GaspUK Last GaspMajalahWeekly Manga ActionDemografiSeinenTerbitSeptember 2003 – Juli 2004Volume1 Drama audioStasiunNHKRilis5 Agustus 2006Episode1 NovelPengarangKei KuniiPenerbitFutabashaTerbit3 July 2007 Film laga hidupYunagi City, Sakura CountrySutradaraKiyoshi SasabeTayang28 Juli 2007Durasi118 men…

Piala Raja Spanyol 1998–1999Negara SpanyolJumlah peserta68Juara bertahanBarcelonaJuaraValencia(gelar ke-6)Tempat keduaAtlético MadridJumlah pertandingan133Jumlah gol315 (2.37 per pertandingan)Pencetak gol terbanyak Claudio López(Valencia C.F.)(8 gol)← 1997–1998 1999–2000 → Piala Raja Spanyol 1998–1999 adalah edisi ke-95 dari penyelenggaraan Piala Raja Spanyol, turnamen sepak bola di Spanyol dengan sistem piala. Edisi ini dimenangkan oleh Valencia setelah mengalahkan Atlético …

Bahasa Jawa TenggerBPS: 0093 1 Cārabasa TenggerPiwākyan Tenggerꦕꦫꦧꦱꦠꦼꦁ​ꦒꦼꦂꦥꦶꦮꦏꦾꦤ꧀ꦠꦼꦁ​ꦒꦼꦂ Pengucapan/təŋgəɾ/Dituturkan diIndonesiaWilayahPegunungan Tengger dan sekitarnyaEtnisTenggerPenutur478.000 (2010)[1]~500.100[a] Rumpun bahasa Austronesia Melayu-Polinesia Jawanik[ib 1] Jawa Bahasa Tengger Sistem penulisan Latin Carakan (Jawa) Status resmiDiakui sebagaibahasa minoritas di Indonesia Jawa Timur D…

Serikat Xaverian (SX) adalah sebuah kongregasi (Ordo keagamaan Katolik) dalam Gereja Katolik Roma yang mengkhususkan diri bagi karya misi. Anggotanya biasa dikenal dengan sebutan Xaverian. Didirikan oleh Mgr. Guido Maria Conforti pada tahun 1895 di Parma, Italia. Serikat Xaverian memiliki nama asli: Pia Societa di San Fransisco Saverio per le Missioni estere (Kongregasi Santo Fransiskus Xaverius bagi Karya Misi). Pada masa remaja, Conforti kagum akan figur St. Fransiskus Xaverius dan sejak saat …

Bulgarian sports society from Sofia, Bulgaria This article is about the sports club. For the football club, see PFC CSKA Sofia. USC CSKA SofiaFirst played5 May 1948 USC CSKA Sofia FootballVolleyballBasketballHockeyWater poloHandballAthleticsGymnasticsChessBoxingWeightliftingCyclingWrestlingJudoRowingShootingSkiBiathlonTennisKickboxingSwimming CSKA (Bulgarian: ЦСКА) was a Bulgarian sports society from Sofia, Bulgaria. CSKA stands for Central Sports Club of the Army (Bulgarian: Централ…

Pour les articles homonymes, voir Disque. Cet article est une ébauche concernant le chemin de fer. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Le disque est un signal ferroviaire de type SNCF. Définition En signalisation lumineuse, le disque est présenté sous forme d'un feu jaune et d'un feu rouge, alignés verticalement ou horizontalement. En signalisation mécanique, il est présenté sous forme d'une coca…

UFC mixed marial arts event in 2020 UFC Fight Night: Lee vs. OliveiraThe poster for UFC Fight Night: Lee vs. OliveiraInformationPromotionUltimate Fighting ChampionshipDateMarch 14, 2020 (2020-03-14)VenueGinásio Nilson NelsonCityBrasília, BrazilAttendanceNone (behind closed doors)[1]Event chronology UFC 248: Adesanya vs. Romero UFC Fight Night: Lee vs. Oliveira UFC Fight Night: Woodley vs. Edwards UFC Fight Night: Lee vs. Oliveira (also known as UFC Fight Night 170 and UF…

Basilica di San RemigioLa Basilica nel 2020Stato Francia RegioneChampagne-Ardenne LocalitàReims Coordinate49°14′35″N 4°02′31″E / 49.243056°N 4.041944°E49.243056; 4.041944Coordinate: 49°14′35″N 4°02′31″E / 49.243056°N 4.041944°E49.243056; 4.041944 ReligioneCattolica TitolareSan Remigio Arcidiocesi Reims Stile architettonico Romanico Gotico Inizio costruzioneXI secolo CompletamentoXIII secolo Modifica dati su Wikidata · Manuale La…

Major League Baseball franchise in Phoenix, Arizona Diamondbacks redirects here. For other uses, see Diamondback. Arizona Diamondbacks 2024 Arizona Diamondbacks seasonEstablished in 1998 Team logo Major league affiliations National League (1998–present) West Division (1998–present) Current uniformRetired numbers205142Colors Sedona red, teal, black, white[1][2]        Name Arizona Diamondbacks (1998–present) Other nicknames The D-backs The Snakes Los Serp…

Buddhist reliquary Shinkot casketThe Shinkot relic casket. The segment Minadrasa Maharajasa (Great King Menander) appears on the closest portion of the lid, outer rim.MaterialSteatiteSizeDiameter: 28.7 centimeters, 11.3 inches.Height: 8.38 centimeters, 3.3 inchesCreated2nd century BCEDiscoveredShinkot, Bajaur34°40′N 71°30′E / 34.66°N 71.5°E / 34.66; 71.5BajaurShow map of PakistanBajaurShow map of Gandhara Shinkot casket inscription segments A, A1 and C, and portio…

Situation of the Christian churches in Germany during the Nazi period For Bismarck's church campaigns, see Kulturkampf. You can help expand this article with text translated from the corresponding article in German. (June 2011) Click [show] for important translation instructions. View a machine-translated version of the German article. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm…

Marathi film director Ravi JadhavBornRavindra Harishchandra Jadhav[1] (1971-09-22) 22 September 1971 (age 52)Mumbai, Maharashtra, IndiaNationalityIndianOccupationFilm directorSpouseMeghana JadhavChildren2Parent(s)Harishchandra Jadhav (father) Shubhangini Jadhav (mother)Websitewww.ravijadhav.com Ravindra Jadhav (born 22 September 1971) known professionally as Ravi Jadhav is an Indian film director, actor, screenwriter and producer. He made his directorial debut with the Marathi music…

Sporting event delegationSouth Africa at the2004 Summer OlympicsIOC codeRSANOCSouth African Sports Confederation and Olympic CommitteeWebsitewww.sascoc.co.zain AthensCompetitors106 in 19 sportsFlag bearer Mbulaeni Mulaudzi[1]MedalsRanked 43rd Gold 1 Silver 3 Bronze 2 Total 6 Summer Olympics appearances (overview)1904190819121920192419281932193619481952195619601964–1988199219962000200420082012201620202024 South Africa competed at the 2004 Summer Olympics in Athens, Greece, from 13 …

Oratorio de la Santa Cueva bien de interés cultural y bien de interés cultural LocalizaciónPaís España EspañaComunidad Andalucía AndalucíaLocalidad CádizCoordenadas 36°32′01″N 6°17′43″O / 36.5335, -6.29535Información religiosaCulto Iglesia católicaDiócesis Cádiz y CeutaHistoria del edificioFundación 1771Fundador José Saénz de SantamaríaConstrucción 1771Datos arquitectónicosTipo OratorioEstilo neoclasicismoIdentificador como monumento RI-51-0…

此條目可参照英語維基百科相應條目来扩充。 (2021年5月6日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 约翰斯顿环礁Kalama Atoll 美國本土外小島嶼 Johnston Atoll 旗幟颂歌:《星條旗》The Star-Spangled Banner約翰斯頓環礁地…

Pakistani TV host and politician (1971–2022) Aamir Liaquat HussainMember of the National Assembly of PakistanIn office13 August 2018 – 9 June 2022Preceded byConstituency EstablishedSucceeded byMahmood MoulviConstituencyNA-245 (Karachi East-IV)In office21 November 2002 – 5 July 2007Succeeded byFarooq SattarConstituencyNA-249 (Karachi-XI)Minister of State for Religious AffairsIn office5 September 2004 – 5 July 2007PresidentPervez MusharrafPrime MinisterShaukat Az…

Kembali kehalaman sebelumnya