Daniel Kolman

Funkcionální dobrodružství v JavaScriptu

| 2 comments |

Funkcionální programování je boží, bohužel tady prostě zatím nemá vybudouvanou tradici. Asi proto, že tu lidi málo hu.. studujou funkcionální jazyky. S příchodem ES2015 alias ES6 alias JavaScriptu budoucnosti se ale FP konečně může dostat do mainstreamu, a tak se nabízí otázky: Co všechno ES2015 nabízí? Kam až nás může ES2015 posunout? Jak by vypadal JavaScript, kdybychom ho psali striktně funkcionálně? Pohodlně se usaďte, otevřte si popcorn a oblíbenou láhev, začínáme! Vítejte v budoucnosti JavaScriptu, v roce 2015!

Currying

Nechci vás hned na začátku vystrašit definicí a tak si rovnou ukažme příklad ve "starém" JavaScriptu (za starý, nemoderní a beznadějně zastaralý JavaScript budeme pro účely tohoto článku považovat jakýkoliv kód napsaný od velkého třesku do roku 2014):

Jak je vidět, currying je částečná aplikace funkce, vlastně takové přednastavení parametrů funkce. Tento koncept není v JavaScriptu nový, například Lodash má na to funkci partial, a dokonce poskytuje wrapper curry, kterým obalíte funkci a ona se vám bude auto-curryovat sama:

V ES2015 ovšem můžeme dosáhnout podobného výsledku přímo, bez knihovny. Musíme ale použít trik, kdy všechny parametry funkce zapíšeme pomocí fat arrow:

Na rozdíl od "plain old" funkce je nutné použít pro každý parametr extra závorky (sum(1)(2)), za to ale získáváme automatický currying bez pomocných funkcí a knihoven! Pokud vám ty závorky navíc vadí, aspoň už chápete, proč v některých jazycích nejsou potřeba, třeba v Haskellu. Mimochodem, celý tento post a kód v něm byl inspirován podobností zápisu x => y => x + y a signaturou funkce v Haskellu, která by v tomto případě vypadala:

První řádek definuje typ funkce sum a můžete ho číst takto: sum je funkce, která bere Int a vrací funkci, která také bere Int a vrací Int. No a stejně můžete číst zápis v JavaScriptu:

Samozřejmě, zapsat to jde i ve starém JavaScriptu, ale postrádá to eleganci Haskellu (teď mě právě všichni skalní Haskellisti odepsali).

A komu tím prospějete co?

Pokud vám doteď připadá že je to jen akademické cvičení bez praktického významu, pak se mýlíte! Currying je velmi praktický například pro Higher-Order komponenty v Reactu. Pokud je budete psát jako dekorátory (podobně funguje funkce connect v react-redux), můžete je krásně poskládat a aplikovat na komponentu:

Dekorátory tříd se možná stanou součástí specifikace ES7, ale k čemu potřebujete zápis se zavináčem a klíčové slovo class, když můžete stejného výsledku dosáhnout jednoduchou funkcionální kompozicí? Nemusíte přece být takoví hipsteři a použít úplně každou novinku, že?

Můžu dnes psát v ES2015?

A nejlepší na tom všem je, že nemusíte čekat, až všechny browsery implementují ES2015, můžete ho začít používat ještě dnes! Zřejmě nejpopulárnější nástroj, který umí transpilovat ES2015 do ES5 (který zvládne skoro každý browser) je Babel. Můžete dokonce zkusit online REPL nebo JSFiddle, který nedávno přidal podporu Babelu (v panelu script si vyberete jazyk Babel). Babel používáme ve Vendavu a můžeme ho bez obav doporučit.

Vtip dne

V JavaScriptových kruzích patří k dobrému vychování zakončit diskusi zostuzením nějakého OOP jazyka. Takže tady to máte:

Hehehe hahaha hihihi, v Javě? Oh wait! Je tu přece Java 8, takže konec legrace, ono to jde a ani to nevypadá moc hrozně. Ok, takže mi ještě ukažte transpiler Javy 8 na Javu 6, kterou používá většina velkých firem a budu zticha. Cože, jak že se ten transpiller jmenuje? Scala? Okay, curry all the things!

(2) Comments

  1. Václav said...

    Spousta enterprajsu mozna pouziva javu 6 jejich smula. Proc pouzivat transliper kdyz muzes mit compiler? co treba Kotlin (-:

    12. prosince 2015 v 11:08
  2. Anonymní

    Fortunately, Jackpot City’s welcome bonus is extraordinarily noticeable certainly. After all, how many of} other casinos are you aware that supply up to as} $1,600 CAD proper off the bat? These 4 deposit bonuses all have a 100% match 우리카지노 up to as} $400 CAD and wagering requirements of 50x.

    8. prosince 2022 v 10:49

Leave a Response