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.
functional-programming
Grzegorz Sławecki
źródło
źródło
Odpowiedzi:
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:
MonadPlus
lub HaskellersMonadOr
)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
do
notacją 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).źródło
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ń.
źródło