Funkcjonalne wzorce projektowe [zamknięte]

106

Istnieje wiele funkcjonalnych idiomów: monady, aplikacje, strzałki itp. Są one udokumentowane w różnych artykułach, ale niestety nie znam żadnej książki ani artykułu, w których są podsumowane w jednym miejscu (jest Typeklasopedia, ale jest dużo obszarów, które nie są dobrze pokryte). Czy ktoś może polecić artykuł / książkę, która dobrze je opisuje w jednym miejscu i która jest dostępna dla programisty ze średnio zaawansowanymi umiejętnościami w zakresie FP?

Konstantin Solomatov
źródło
Nie odpowiada bezpośrednio na twoje pytanie, ale to drugie pytanie ma kilka interesujących informacji (i przynajmniej link lub dwa): stackoverflow.com/questions/327955/ ...
reuben
15
Czy mógłbyś rozwinąć, które obszary Twoim zdaniem nie obejmują typeklasopedii?
dave4420
2
@ dave4420 Jeśli czytam typeklasopedię od początku do końca, im więcej czytam, tym mniej rozumiem. Pierwsze sekcje są naprawdę dobre, ale drugie są dla mnie mało czytelne.
Konstantin Solomatov
3
@KonstantinSolomatov być może będziesz musiał zbadać sekcje, których nie rozumiesz, przejrzeć posty na blogu i uważnie przyjrzeć się kodowi. wszystkie te „wzorce projektowe” w typeklasopedii są w rzeczywistości abstrakcjami, często głębokimi, które czasami wymagają trochę czasu, zanim się wnikną.
jberryman
1
@DanBurton nie jestem pewien, czy źle odczytałeś mój komentarz, ale zakwalifikowałbym je wszystkie jako głębokie abstrakcje, chociaż łatwo o tym zapomnieć, gdy masz swoje „Ah ha!” za chwilę.
jberryman

Odpowiedzi:

35

Jeśli chcesz nauczyć się Scali, proponuję przeczytać książkę Paula Chiusano i Runara Bjarnasona:

http://manning.com/bjarnason/

Część II: Projektowanie funkcjonalne i biblioteki kombinatorów

  1. Tworzenie małych języków
  2. Serializacja JSON
  3. Testowanie oparte na specyfikacji
  4. Parsery
  5. Czysto funkcjonalna równoległość
  6. Stan czysto funkcjonalny

Część III: Funkcjonalne wzorce projektowe

  1. Argumenty za abstrakcją
  2. Monoidy
  3. Funktory
  4. Monady
  5. Funktory aplikacyjne
  6. Przemieszczalne i składane struktury danych
  7. Comonads

Część IV: Łamanie zasad: efekty i I / O

  1. Efekty a skutki uboczne
  2. Przetwarzanie strumieniowe i przyrostowe operacje we / wy
  3. Egzekwowanie zakresu efektu za pomocą systemu typów
Edmondo1984
źródło
31

Przykro mi, że nie znam artykułów ani książek, które szczegółowo opisują różne zastosowania wszystkich tych konstrukcji, ale mogę podać kilka linków do poszczególnych zasobów.

Dość powszechnym wzorcem jest budowanie transformatorów monad zamiast prostych monad (zobacz także link w następnym akapicie). Zasadniczo oznacza to, że budujesz coś, co musi być połączone z innymi monadami, w wyniku czego bardziej złożona jest w stanie obsłużyć cechy obu z nich.

W Real World Haskell jest kilka rozdziałów o monadach. W rozdziale 14. Monady autorzy wyjaśniają podstawy i niektóre typowe zastosowania (być może lista, stan). Rozdział 15. Programowanie za pomocą monad zawiera więcej wyjaśnień, jak efektywnie z nich korzystać (obejmuje również monadę czytelnika). Poniższy rozdział wyjaśnia, jak używać Parseka , ale może być bardziej interesujące poszukanie artykułów opisujących, jak to faktycznie działa: powinien to być naprawdę dobry przykład dobrze zorganizowanego wykorzystania monad do parsowania. Fianlly, Rozdział 18. Transformatory monadprzedstawia sposób działania transformatorów monadowych, a następnie pokazuje, jak je zbudować, krok po kroku. Ciekawe są również rozważania dotyczące ostatnich części rozdziału.

Przeczytałem kiedyś naprawdę interesujące pytanie na SO dotyczące twórczego wykorzystania monad . Proponowane linki były świetnymi lekturami na ten temat. W tym duchu starałem się zapytać to samo o strzały : na pewno dostałem mniej odpowiedzi niż ta na monadach, ale i tak ciekawych.


Jeśli chodzi o wzorce OOP autorstwa czwórki, istnieje niezły zestaw 3 artykułów IBM na ten temat z ich serii Myślenie funkcjonalne . Docelowym językiem funkcjonalnym jest Scala. Kontynuują, wyjaśniając typowe wzorce projektowe w OOP i pokazując, jak mapują się w Scala.

  1. Myślenie funkcjonalne: funkcjonalne wzorce projektowe, część 1 . Tutaj dotyczą fabryk, metod szablonowych, strategii, wagi muszej. Najważniejsze jest to, że mając funkcje jako wartości pierwszej klasy, wszystko jest znacznie prostsze.
  2. Myślenie funkcjonalne: funkcjonalne wzorce projektowe, część 2 . Chodzi o java i groovy . Adresuje wzór adaptera.
  3. Myślenie funkcjonalne: funkcjonalne wzorce projektowe, część 3 . Tutaj mówią o schemacie tłumacza. Ponownie, język docelowy jest świetny.

Najistotniejszym artykułem na twoje pytanie jest z pewnością pierwszy, ale pozostałe dwa mogą być jednak interesującymi powiązanymi lekturami.

Riccardo T.
źródło
Dzięki, ale mam na myśli różne rodzaje wzorców, jak wzorce Monad, Arrow, Applicative no GoF.
Konstantin Solomatov
@KonstantinSolomatov: Źle zrozumiałem twoje pytanie, przepraszam. Dodałem kilka odniesień do monad i strzał.
Riccardo T.,
18

Jeremy Gibbons prowadzi blog Patterns in FP, który ostatecznie ma stać się książką, o którą prosisz. Oczywiście nie jest to jeszcze w stanie, aby być tak użytecznym, jak byś chciał w tej chwili, ale zasługuje na zachętę!

W międzyczasie powiem +1 dla Typeklasopedii Brenta Yorgeya. Jest to naprawdę przydatne, a jeśli są późniejsze części, które mylą, ta strona jest dobrym miejscem, aby dotrzeć do ich sedna. Wiem, że Brent kontroluje to. Jeśli nie dociera do swoich czytelników, pomóż mu.

świniarz
źródło
5

Czy przeczytałeś późniejsze rozdziały Learn You a Haskell for Great Good ?

  • Rozdział 6 obejmuje mapy i fałdy, które są dwoma ważniejszymi „wzorcami projektowymi” w językach funkcjonalnych.

  • Rozdziały 11-13 omawiają funktory, funktory aplikacyjne i monady w tej kolejności. Jest to pomocne - wiele tutoriali wprowadza funktory, a następnie monady, a na końcu dodajemy funktory aplikacyjne (jeśli w ogóle je obejmują). Porządek w LYAH jest lepszy, ponieważ przejście z Functors => Applicative Functors => Monady przesuwa cię stopniowo w górę po drabinie ogólności i mocy.

  • Rozdział 14 dotyczy Zipperów - możesz o nich efektywnie myśleć jak o klasach kontenerów ze wskaźnikiem do określonej części danych, co oznacza, że ​​uzyskujesz dostęp O (1) i aktualizujesz je w miejscu wskaźnika.

Nie obejmuje strzałek ani Comonad, które są bardziej zaawansowanym tematem w Haskell. Aby zrozumieć, jak i dlaczego używać strzałek lub komonad, zdecydowanie powinieneś mieć już solidną wiedzę na temat monad, więc nie sądzę, aby to był problem - LYAH jest mocno skierowany do początkujących użytkowników rynku Haskell.

Chris Taylor
źródło
1
Tak, przeczytałem książkę. Podobało mi się to bardzo. Niestety nie ukrywa strzał i wielu innych zaawansowanych wzorów. Chcę też przeczytać więcej o monadach i aplikacjach (na przykład LYHGG nie obejmuje monady kontynuacyjnej).
Konstantin Solomatov