Movatterモバイル変換


[0]ホーム

URL:


Przejdź do zawartości
Wikipediawolna encyklopedia
Szukaj

Monada (programowanie)

Z Wikipedii, wolnej encyklopedii

Monada – wprogramowaniu funkcyjnym: rodzajkonstruktoraabstrakcyjnego typu danych, który implementuje funkcjewiązania (ang. bind) orazjednostki (ang. unit)[1][2]. Pojęcie to wywodzi się zteorii kategorii, gdzie omawiany abstrakt stanowimonadę nad kategorią typów z funkcjami jako morfizmami. Jednostka określa operację tworzeniasingletonu czy też akcji, której wynikiem jest zadana wartość. Wiązanie (w niektórych językach określane jakoflat map) buduje na podstawie wyniku poprzedniego obliczenia nowe obliczenie, zachowując przy tym jego formę.

Jedną z głównych cech monad jest to, że pozwalają wynieść pewne mechanizmy i zachowania do abstrakcji, zwalniając tym samym programistę z konieczności ręcznej obsługi kontekstu. Przykładowo, działając na (jakkolwiek zdefiniowanych)zbiorach można opisać jednostkę jako

unit:AP(A){\displaystyle unit:A\to P(A)}
unit(x)={x}{\displaystyle unit(x)=\{x\}}

oraz wiązanie jako

bind:P(A)(AP(B))P(B){\displaystyle bind:P(A)\to (A\to P(B))\to P(B)}
bind(s,f)={f(x)|xs}{\displaystyle bind(s,f)=\bigcup \{f(x)|x\in s\}}

by potem w sposób generyczny budować potoki danych w kompletnym oderwaniu od wewnętrznej implementacji czy nawet interpretacji. Dla przykładu konstruowanieiloczynu kartezjańskiego dwóch zbiorów mogłoby przebiegać tak:

prod(A,B)=bind(A,λabind(B,λbunit(a,b))).{\displaystyle prod(A,B)=bind(A,\lambda a\to bind(B,\lambda b\to unit(\langle a,b\rangle ))).}

Istotne w tym przykładzie to, że przy definiowaniu operacjiprod ani razu nie skorzystano z faktu, że nośnikiem danych jest matematyczny zbiór. Będzie ona zatem działać dla każdej monady, bez względu na jej wewnętrzną reprezentację.

To podejście stanowi popularnywzorzec projektowy, który ma szerokie zastosowanie przy definiowaniu obliczeń zawierających dodatkowe reguły przetwarzające, jak chociażby transformowanie stanu,współbieżność, obsługęwejścia-wyjścia lubwyjątków.

Przykłady

[edytuj |edytuj kod]

Haskell

[edytuj |edytuj kod]

WHaskellu monada jestklasą zrzeszającą typy orodzaju{\displaystyle *\to *}

classMonadmwhere(>>=)::ma->(a->mb)->mb(>>)::ma->mb->mbreturn::a->mafail::String->ma

Operacje wiązania>> oraz>>= łączą ze sobą dwie wartości monadyczne, podczas gdy operacjareturn umieszcza wartość w monadzie. Operator>>= formuje wartość monadyczną obliczającą wynik typub na podstawie wyniku lewego argumentu będącego wartością monadyczną z wynikiem typua. Funkcja>> jest używana wtedy, gdy przebieg wiązania nie zależy od wyniku lewego argumentu, a jedynie od jego kontekstu.Haskell posiada syntaktyczne wsparcie monad przy użyciu tzw. notacjido:

bez_do::(Monadm,Alternativem)=>mInt->mInt->mIntbez_dom1m2=m1>>=\x1->m2>>=\x2->guard(x2/=0)>>return(x1/x2)z_do::(Monadm,Alternativem)=>mInt->mInt->mIntz_dom1m2=dox1<-m1x2<-m2guard(x2/=0)return(x1/x2)

Scala

[edytuj |edytuj kod]

WScali monadą jest każdaklasa, która implementuje operacjeflatMap orazunit

traitM[A]{defflatMap[B](f:A=>M[B]):M[B]}defunit[A](x:A):M[A]

Odpowiednikiem notacjido w Scali jestfor comprehensions:

defbez_for(m1:M[Int],m2:M[Int]):M[Int]=m1.flatMap(x1=>m2.flatMap(x2=>unit[M](x1+x2)))defz_for(m1:M[Int],m2:M[Int]):M[Int]=for{x1<-m1x2<-m2}yield(x1+x2)

Przypisy

[edytuj |edytuj kod]
  1. Haskell Programming From First Principles Christopher Allen, Julie Moronuki, s. 755–799.
  2. Demystifying the Monad in Scala [online], Developer News, 4 grudnia 2015 [dostęp 2019-07-20] (ang.).
Źródło: „https://pl.wikipedia.org/w/index.php?title=Monada_(programowanie)&oldid=60729742
Kategoria:

[8]ページ先頭

©2009-2026 Movatter.jp