Czy wyrażenie obliczeniowe jest takie samo jak monada?

22

Wciąż uczę się programowania funkcjonalnego (z f #) i ostatnio zacząłem czytać o wyrażeniach obliczeniowych. Nadal nie rozumiem w pełni tego pojęcia, a jedną rzeczą, która nie daje mi pewności, gdy czytam wszystkie artykuły dotyczące monad (większość z nich jest napisana na podstawie Haskella), jest związek między wyrażeniami obliczeniowymi a monadami.

Po napisaniu tego wszystkiego, oto moje pytanie (właściwie dwa pytania):

Czy każde wyrażenie obliczeniowe F # jest monadą? Czy każdą monadę można wyrazić za pomocą wyrażenia obliczeniowego F #?

Przeczytałem ten post Tomasa Petricka i jeśli dobrze go rozumiem, stwierdza, że ​​wyrażenia obliczeniowe są czymś więcej niż monadami, ale nie jestem pewien, czy interpretuję to poprawnie.

Grzegorz Sławecki
źródło
@Raphael, mogę zapytać, jaki jest powód usunięcia tagu lang?
Grzegorz Sławecki,
2
Ponieważ zależy nam na pojęciach, staramy się zachować większość rzeczy bez względu na język. Nie wiem, co usunięcie F # robi z pytaniem ( myślę, że jeśli to ważne, że to F #, to pytanie jest tutaj nie na temat, ale jest to sprawa graniczna), więc usuwam tylko tag F #. Ogólna zasada: F # nie jest koncepcją CS, więc nie potrzebuje tagu. (Tak, znam inne tagi PL i też ich nie lubię. W przypadku niektórych pytań społeczność zdecydowała, że ​​gwarantują te tagi.)
Raphael
1
@Raphael Uważam, że pytanie jest rzeczywiście sprawą graniczną. Ktoś zdecydował się na migrację tutaj, ale wydaje się, że jest to również nieco nie na temat. Samo pytanie jest rodzajem komputera, ale jednocześnie odpowiedzi i pytanie są szczególnie związane z f #. Rozumiem twoją ogólną zasadę, dziękuję za wyjaśnienia.
Grzegorz Sławecki

Odpowiedzi:

22

Po pierwsze, wyrażenia obliczeniowe są cechą językową, podczas gdy monady są abstrakcjami matematycznymi, więc z tego punktu widzenia są to zupełnie różne rzeczy .

Ale to nie byłaby bardzo przydatna odpowiedź :-). Wyrażenia obliczeniowe to funkcja języka zapewniająca składnię, której można używać do programowania obliczeń (lub typów danych) o strukturze monadycznej, ale można ich także używać z innymi strukturami. Możesz przeczytać mój papier do wyrażeń obliczeniowych F #, aby uzyskać więcej informacji, ale wyrażeń obliczeniowych można używać z:

  • Monady, ale także monady addytywne (jak nazywają MonadPluslub Haskellers MonadOr)
  • Złożone obliczenia (tak zwane przez Haskellerów transformatory monadowe)
  • Obliczenia, które są monadyczne, ale obsługują inne konstrukcje F #, takie jak obsługa wyjątków
  • Monoidy (i kilka odmian bez wiązania monadycznego)
  • Funktory aplikacyjne (choć jest to zaimplementowane tylko w rozszerzeniu badawczym)

Wyrażenia obliczeniowe są więc z pewnością ściśle powiązane z monadami, ale nie są z nimi ściśle powiązane. Jest to sprzeczne np. Z donotacją Haskella , która jest znacznie ściślej powiązana z monadami (chociaż nawet tego można użyć w obliczeniach, które nie są monadami ściśle matematycznymi).

Tomas Petricek
źródło
3
Transformatory monadowe to ogólny sposób na konwersję jednej monady na inną monadę - wyrażenia obliczeniowe F # naprawdę obsługują tylko bezpośrednią implementację / result / tej transformacji, a nie samą transformację.
GS - Przeproś Monikę
1
@GaneshSittampalam - Tak, masz rację. Moja próba uproszczenia nie była tu aż tak przydatna :-). Wyrażenia obliczeniowe mogą dać ci składnię do pracy z obliczeniami, które są wynikiem zastosowania transformatora monady (z potencjalnie różną składnią dla podstawowej monady i złożonej monady)
Tomas Petricek
5

Za pomocą wyrażeń obliczeniowych można wyrażać monady. Oto przykład . Ponadto, jak zauważyłeś, możesz używać wyrażeń obliczeniowych dla znacznie więcej niż tylko monad. Jest to rozszerzona o wyjaśnienie w jaki sposób są one różne tutaj . Nie ma tu miejsca na prawidłowe wyjaśnienie różnicy, ale wyrażenia obliczeniowe różnią się od monad tym, że wykorzystują normalną składnię F # i mają możliwość dodawania dodatkowych abstrakcji. Ograniczeniem jest to, że nie idiomatyczne (i trudne) jest napisanie wyrażenia obliczeniowego, które jest polimorficzne w stosunku do rodzaju obliczeń.

Nie dotyczy
źródło
1
Prosimy o bardziej samodzielne udzielenie odpowiedzi poprzez przynajmniej podsumowanie materiału na stronach, do których prowadzą linki. Twoja obecna odpowiedź będzie zupełnie bez znaczenia, jeśli dwa linki przestaną działać.
David Richerby,
2
Nie jestem pewien, o czym mówisz. Wyraźnie odpowiedziałem na pytania, a następnie podałem linki do dodatkowych informacji, jeśli pytający jest zainteresowany. Linki nie są potrzebne, aby odpowiedzieć na pytanie.
N_A
1
Nie mogę sobie nawet wyobrazić, że dwa linki mogą kiedykolwiek przestać działać :-)
Tomas Petricek