Nikoliv, i v Haskelu je to stejné jako v tom xslt, krásné jsou jen školní příklady, praxe je odpudivá. Podívejte se jen, co se dělalo a dělá v javascriptu, aby se potlačila jeho funkcionální povaha, jaké ohavné konstrukce a ornamenty.
I to XSLT může vypadat hezky, dokonce i v praktickém provedení. Je to jako s každým jazykem: Po někom se to číst dá a po někom ne.
Jinak ale deklarativní styl programování vede na horší udržovatelnost programu, protože daní za hutnost výrazových prostředků je používání mnoha jen málo modifikovaných frází, takže když něco musíte změnit, je to nutné měnit na mnoha místech a které je obtížné i vyhledat.
Ale houby. XSLT se dá psát normálně kulturně a s dodržováním DRY.
Extrémním příkladem neefektivity tohoto druhu jsou css styly.
Další hloupost. Někdo prostě CSS pochopil a někdo ne. Ten, který to nepochopil, mívá CSS i několikrát delší než HTML, ke kterému patří. Prostě nepochopil, že "C" znamená "cascade".
Lambda výrazy jsou pak novodobé goto, snadno se použijí a proto se nevytvoří jedna funkce, která se použije vícekrát, ale lambda výraz, pro každé použití trochu jiný.
Opět hloupost. Lambda výraz nemá s goto nic společného. Používá se tam, kde by bylo nevhodné deklarovat funkci pro jedno použití jinde než v místě toho užití nebo ji chceme předávat jako parametr jiné funkce. Pokud někdo porušuje DRY, není to vinou lambda výrazů, ale jeho neschopnosti.
Pokud je ten lambda výraz pokaždé jiný, je to v pořádku. Nechceme přece psát funkce plné ifů a switchů jen proto, abychom místo tří specializovaných funkcí napsali jednu univerzální s dalším parametrem pro switch. To je cesta do pekel.
Může, ale téměř nikdo to nedělá, a taky nepočítáte s tím, co udělá s programem údržba.
Goto lze taky používat rozumně, ale svádí k tomu usnadnit si práci s návrhem. Totéž lambda výrazy. Totéž css. Není třeba psát univerzální funkce, ale krátké funkce a mít problém dobře logicky strukturovaný. Funkce oproti lambda příkazu má tu výhodu, že vznikne pojmenovaný kus kódu, který lze na jednom místě změnit, aby došlo ke změně chování všude. To lambda výrazy nesplňují, naopak plní funkci špatně použitého goto. Tam kde se vám nechce vymyslet výstižné pojmenování, tam prásknete lambda funkci, nemáte-li pojmenování, znamená to, že vlastně nemáte dobře promyšlené co děláte a lambda funkcí jste si jen usnadnil práci a často zprasil návrh.
Add css, kdyby to byla pravda, tak by nikdo neexperimentoval s LESS a nikdo by se nesnažil do javascriptu zavádět klasické třídy.
určitě je lepší než napsat:
red_cars = map(lambda x: x.color = 'red', filter(lambda x: x.id == 'ID2376', cars))
je lepší napsat
def set_color(color):
return lambda x: x.color = color
def where_id(id):
return lambda x: x.id == id
car.id = 'ID2376'
red_cars = map(set_color('red'), filter(where_id(car), cars)
protože pak můžete v budoucnosti vylepšit vyhledávání pomocí regulárního výrazu, nebo strukturovat data různých entit a typů podle jednotné šablony, obsahující id, barvu a podobně.