W clojure, kiedy powinniśmy użyć monady zamiast makra i vice-versa?

Jest zbyt wiele tutoriali o monadach, które mówią... "Patrz! oto przypadek, w którym możemy użyć monady " lub "po to jest monada". Chcę wiedzieć, jakie są niektóre z kroków, które ludzie używają, aby dojść do wniosku, że mogą powiedzieć sobie: "o rany! Wygląda na to, że przydałaby się tu monada!"

Więc kiedy ktoś mi powie... "(bla) nie ma nic wspólnego z monadą...", to naprawdę nie pomaga mi odpowiedzieć na moje pytanie, czyli:

  • Jak zastanów siÄ™, jakie wzorce w programach można wyrazić za pomocÄ… monad?
  • Jak mogÄ™ napisać wÅ‚asnÄ…, spersonalizowanÄ… monadÄ™, gdy zidentyfikujÄ™ potencjaÅ‚ jej wykorzystania?

Zacząłem tu bardzo długie pytanie o monady jeśli ktoś jest zainteresowany pomocą - Mapuj i zmniejsz Monadę dla Clojure... A co z monadą Juxt?.

Powrót do tego pytania:

kiedy powinniśmy użyć monady zamiast makra i vice-versa?

  • czytaÅ‚em artykuÅ‚y i oglÄ…daÅ‚em prezentacje, które mówiÄ…... "Monady sÄ… używane do abstrakcji DSL".... jednak wiÄ™kszość bibliotek Clojure DSL (np. czkawka i korma) używajÄ… defmacro i dziaÅ‚a Å›wietnie.

a po co nam monady w clojure skoro mamy makra?

Author: Community, 2012-03-28

3 answers

Używam Clojure od dwóch lat i jedyny raz używałem monad jako ćwiczenia, aby pokazać, że można to zrobić. Nigdy nie potrzebowałem ich do "prawdziwego" kodu.

Monady są znacznie bardziej powszechne w Haskell, ponieważ:

  • sÄ… idiomatycznym sposobem obsÅ‚ugi obliczeÅ„ stanu. W Clojure zazwyczaj obsÅ‚ugujesz stan za pomocÄ… managed reference, wiÄ™c monady nie sÄ… tak potrzebne w Clojure.
  • podobnie dla IO: Clojure pozwala na IO bezpoÅ›rednio bez deklarowania tego w swoim typie, wiÄ™c nie potrzebujesz monady IO.

Moją propozycją byłoby skupienie się na standardowym programowaniu funkcyjnym w Clojure. Jeśli nie widzisz, że naprawdę potrzebujesz monad, to nie inwestowałbym zbyt wiele czasu w próby ich sprowadzenia.

Makra są nieco inną kwestią: służą do generowania kodu w czasie kompilacji i rozszerzeń składni języka (które mogą zawierać DSLs, chociaż DSLs niekoniecznie potrzebują makr). I używaj makr, gdy obie z poniższych wartości są prawdziwe:

  1. chcę rozszerzyć składnię języka w sposób, który znacznie poprawia moją zdolność do rozwiązania konkretnej domeny problemu.
  2. I nie mogę uzyskać tej samej funkcjonalności z normalnymi funkcjami / składem funkcji. Normalne funkcje powinny być twoim pierwszym wyborem, jeśli to możliwe: są zwykle prostsze do napisania i utrzymania.

P. S. jeśli naprawdę jesteś zainteresowany monadami do Clojure, oto dwa filmy Ja osobiście znalazłem całkiem dobre:

 36
Author: mikera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-28 09:22:42

Monady i makra nie mają ze sobą nic wspólnego. Służą one do rozwiązywania różnych problemów. W Clojure biblioteka monad dość szeroko wykorzystuje makra do implementacji składniowego "interfejsu użytkownika" do monad. Możesz również użyć monad do zaimplementowania funkcji niektórych bibliotek, a następnie dodać warstwę makr dla interfejsu zewnętrznego.

Co do "kiedy można używać monad w Clojure", to widzę dwa przypadki użycia:

1) zaimplementować rzeczy, które mają sens w więcej niż jednej monadzie, w zlecenie wykonania pracy tylko raz i "podłącz" monadę później. tutaj {[6] } jest miłą ilustracją tego podejście, choć niestety (z pedagogicznego punktu widzenia) dla raczej nietrywialne zastosowanie: programowanie logiczne.

2) wdrożyć technikę kompozycji, która może być sformułowana jako monada, w celu zysk z istniejącej infrastruktury monad.

Clojure ma dwie wbudowane monady: "let" (identity monad) I " for " (sequence monad). Whenever you szkoda, że nie można podłączyć jeden z nich do kodu później, należy użyć" domonad " zamiast. I kiedy chcesz mieć coś podobnego, ale nie do końca tego samego, powinieneś rozważyć napisanie własnej monady.

To pozostaje raczej abstrakcyjne, niestety. W tej chwili nie ma zbyt wielu opublikowanych i dopracowanych przykładów kodu, które używają monad w Clojure. W miarę jak Więcej Clojurian zapoznaje się z monadami i więcej ekspertów monad (zwykle pochodzących z Haskell) używa Clojure, może to się zmienić. I widziałem (ale nie mam pod ręką) monadyczne parsowanie wykonane w Clojure, na przykład.

 16
Author: khinsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 10:47:00

@khinsen i @mikera odpowiedzieli na pytanie tak dobrze, że trudno o dodatkowe komentarze, ale myślę, że pominęli jeden punkt (albo nie mogłem znaleźć go w ich komentarzach).

W Clojure makra są częścią języka. Używaj ich, czy nie, ale tam są. W rzeczywistości często nie będziesz miał wyboru, jak tylko z nich korzystać, ponieważ sprawiają, że Twoje aplikacje są bardziej idiomatyczne (jest to cecha profesjonalnego używania dowolnego języka). Pozwalają na preprocesję struktur danych, które składają się na podanie. Są one zbliżone do innych konstrukcji językowych w tym sensie, że są uwzględniane niezależnie od twoich potrzeb.

W przeciwieństwie do makr, monady nie są częścią Clojure. Są one budowane przy użyciu konstrukcji języka, a mianowicie makr. Nie są one uwzględniane w czasie wykonywania, chyba że nalegasz na ich obecność. Dla mnie monady są wzorcami projektowymi do komponowania obliczeń i dlatego są podobne do innych wzorców projektowych, które możesz znać. Wykorzystujesz wzorce projektowe do opracowania modułowych i spójne aplikacje i czy to monady, makra lub inne konstrukcje językowe, powinieneś wiedzieć, że istnieją i pracować z nimi dla Twojego dobra.

Jeśli chodzi o twoje pytanie, makra działają, zanim monady kiedykolwiek zaczną działać. Makra działają na etapie kompilacji-zmieniają struktury danych na inne. Monady są wzorcem konstrukcyjnym do tworzenia obliczeń. To jest różnica. W Clojure monady są pisane za pomocą makr( aby ułatwić ich użycie), dlatego ludzie mają tendencję do mówienia, co można zrób z monadami, które możesz łatwo osiągnąć za pomocą makr. To prawda, ponieważ wynika to z projektowania monad w Clojure, ale to samo można powiedzieć o samych makrach. Nie musisz pisać nowych przez większość czasu, a pierwszą zasadą makro klubu jest, aby w ogóle ich nie pisać , ale nadal są częścią języka i powinieneś być bardzo dobrze świadomy ich zastosowań.

Zobacz Jak Programiści Clojure używają makr? więcej dyskusji na temat makr.

 4
Author: Jacek Laskowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:33