Horší je to právě s tím stromem - v FP musím při zápisu někde dole zpětně "přeskládat" celý strom, nemůžu jenom najít list, zapsat do něj a mám hotovo.
To neni tak docela pravda, staci jen vtipne "pretacet" pointery (menit misto, kde ten strom ma koren), rika se tomu zipper.
Kazdopadne, je treba si uvedomit, ze FP je abstrakce, ktera ma slouzit programatorum, aby jejich kodu slo lepe porozumet (a byl lepe udrzovatelny), nikoli pocitacum, aby provadeli ten kod rychleji. To je casty mylny dojem. FP dnes fakticky znamena cenu navic, kterou se kompilatory postupne snazi dohnat. Je nadeje, ze to pomuze lepe psat treba vicevlaknove programy, ale zatim to tak docela neni.
Je to podobne jako treba s GOTO. Dnesni jazyky GOTO neumoznuji, prestoze by to v nekterych situacich bylo efektivnejsi (treba obecne stavove automaty, rizeni vyjimek, atd.). Spoleha se misto toho na kompilator, ze z relativne cisteho strukturovaneho kodu vytvori efektivni spagety.
Takze abych se vratil k tomu, ze FP neumoznuje datove struktury obsahujici cykly. Je to proste podobny trade-off. Kdyz definujes takovou strukturu, musis se vyporadat s tim, ze zmena pointeru potencialne znamena memory leak (nebo pro rypaly - GC cyklus, vyber si svuj jed). Proto je lepsi se jim vyhnout, a vetsinou to jde. Ale je celkem dobre mozne, ze jsou treba pouzite v nejake knihovne, jejiz API je navenek zcela funkcionalni.
Je to asi podobne jako kdyby sis stezoval, ve strukturovanem programovani, hm, kdyz mam vsechno definovane jako procedury a jejich volani, tak se nemuzu "jen tak" vratit do uz existujiciho stack framu (aniz bych zrusil ty volane). Jelikoz to neni obecne dobry napad, delat takove veci, tak se s tim proste naucis pracovat. Analogicky, zase muze existovat knihovna (nebo spis kompilator), ktera treba efektivne implementuje stavove automaty, a tohle pravidlo interne celkem bezne porusuje.