Skoda, ze v knizce chybi Haskell, protoze to je "enfant terrible" v FP. To ji v mych ocich dost degraduje.
Byl jsem dlouho odpurcem FP, ale nakonec jsem skoncil (po kratkem koketovani se Scalou a Clojure) u Haskellu. Dlouho jsem premyslel nad tim, cim se FP a OOP lisi, a co to znamena pro architekturu. Nakonec, diskuse s kolegou o OOP, znamenala pro me prulom v teto otazce.
Moje soucasna domnenka - OOP a FP se lisi v pojeti rozhrani mezi castmi programu, a ve zpusobu zapouzdreni dat. V OOP jsou rozhranim volani metod objektu, tedy akce, ktere ma cilovy objekt provest. Data se pritom snazime zapouzdrit do objektu. Naproti tomu v FP jsou rozhranim samotna data (v podstate typy).
Svym zpusobem jde o dualni pristup. V OOP predavame v ramci casti programu data zapouzdrena v objektech, v FP predavame (opacnym smerem) funkce, ktere nad temi daty pracuji. IMHO kazdy design pattern v OOP lze prevest do FP tim, ze misto predavani objektu budeme predavat funkce opacnym smerem. Take se na to lze divat jako na zmenu vztazne soustavy - v OOP jsou funkce na miste a data se pohybuji, zatimco v FP se pohybuji funkce a data stoji na miste.
Proto se tak FP uplatnilo v MapReduce paradigmatu (a jeho naslednicich), ktere je cele o tom, predavat mezi distribuovanymi uzly operace k datum misto samotnych dat. A v podstate i puvodni Unixove paradigma rour je dost funkcionalni, akorat ta datova rozhrani jsou ad hoc, vetsinou textova.
Myslim, ze pristup FP je lepsi, protoze:
- Data se lepe semanticky definuji nez operace. Pokud jsou tedy rozhranim data a ne operace, je snazsi tomu rozhrani porozumet.
- Data jako rozhrani davaji vetsi prostor ke znovupouzitelnosti. Nad objektem, ktery data skryva, jsme omezeni akcemi, ktere dovoluje jeho rozhrani. V FP ale k danym datum muzeme provadet libovolne operace. To je hezky videt prave na Unixovem pristupu, ktery je asi nejlepsim uspechem modularity v pocitacich vubec.
- V OOP se casto stava, ze potrebujete data prece jenom predat, a to pak znamena spoustu operaci, ktere jsou v podstate identitou. V FP tohle odpada, protoze je zrejme, ze nekde predavate identickou funkci.