Dla fanów książek:
-
https://www.cs.nott.ac.uk/~pszgmh/pih.html (Programming in Haskell 2nd edition, tak naprawdę wprowadzenie do programowania funkcyjnego, sporo rzeczy pominiętych np. efekty, monad transformers ale dla kogoś kto nie miał w ogóle styczności z FP to i tak będzie aż za dużo materiału. Najważniejsze że jest "state monad" opisany.)
-
https://haskellbook.com/ - tej pozycji jeszcze nie czytałem, ale słyszałem na HN bardzo dobre o niej opinie. Mam PDF'a spis treści wygląda bardzo obiecująco, omówione jest wszystko w tym te nieszczęsne monad transformery.
-
Functional programming in Scala - jeżeli ktoś jest fanem Scali. Tutaj moje odpowiedzi do ćwiczeń: https://github.com/marcin-chw[...]nscala/chp8/PropTesting.scala Nie polecam dla początkujących, nieco już obeznani z FP docenią tą pozycję - ta książka to tak naprawdę zeszyt ćwiczeń robisz ćwiczenia, zaczynasz rozumieć. Opisane parser combinators i property based testing, jak również równoległość. Sporo ćwiczeń wokół różnych state monad więc można się mentalnie przygotować na starcie z IO.
Generalnie miałem jakiś tam kontakt z FP w pracy więc widziałem też FP od drugiej strony:
- W Scali nie da się mieszać różnych typów monad np. Writer i Option lub Future i Option, potrzeba Monad Transformers żeby obejść ten problem np. OptionT
- Jeżeli już jesteśmy przy monad transformers to zaczyna się pojawiać pojęcie efektów np. Option to efekt opcjonalności a Future to efekt odroczonego wykonania programu, w kodzie oznacza to tyle że jako parametr generyczny pojawia się typ E[_] (a więc typ generyczny który przyjmuje parametr; HKT) i to na nim się operuje zamiast na Future czy Option. Tu jest wyjaśnione jak należy:
- Modyfikacja zagnieżdżonych immutable struktur ssie i to ssie porządnie, rozwiązanie to kolejna biblioteka aka murarka funkcyjna: https://www.optics.dev/Monocle/ Tu pojawia się pojecie lens'ów a nawet prismów LOL
- Poza znanymi Option, Either, Future (choć to nie monada) to w życiu zawodowym spotkałem jeszcze jedynie Writer'a (dodaje logi do zwracanego obiektu). Nie piszemy stricte funkcyjnie więc IO znam tylko z książek (a i to słabo).
- Property based tests działają tyle że wolno :P Warto wiedzieć że coś takiego jest, czasami się przydaje.
Generalnie ja rozumiem że "killer feature" i "selling point" programowania funkcyjnego to możliwość rozumowania o kodzie programu. Kod ma stać się podobny do algebraicznego równania i ma podlegać ścisłym prawom matematyki. Czas zostaje niejako wyrugowany z programu. Przykładowo w programie funkcyjnym zawsze można zastąpić zmienną (a raczej stałą :P) wyrażeniem ją definiującym i nie zmieni to zachowania programu.
W praktyce wydaje mi się że praca ze stanem jest największą kulą u nogi FP (nie licząc oszołomów z category theory). Taki sposób reprezentacji programu nie jest do końca intuicyjny i wymaga sporo wysiłku żeby zostać zrozumianym. Przyklad jak wygląda losowanie liczb w wydaniu funkcyjnym: https://github.com/marcin-chw[...]k/fpinscala/chp6/Random.scala