Tyjo pořád víc si říkám, kolik se někde mezi lety řekneme 1985-1990 udělalo v IT špatných rozhodnutí, za které platíme dodnes. Co to bylo u ML, že se neprosadilo? Možná neexistoval překladač pro PC? Ten koncept typů v ML a F# se mi strašně líbí, je to to nejlepší z obou světů. Ale vývoj šel jinam :(
Jo no. Ono se totiž ukázalo, že nejenom, že class-based OOP je někdy dost neintuitivní (když se všude tlačí dědičnost - viz ve své době slavný spor Virius vs Čada), ale že se problém, se kterým se vývojáři musí srovnat přesunul - už to (IMHO) není o modelování a převodu modelů do zdrojáků, ale o řízení mutable stavu aplikací. A tady různé funkcionální techniky hoodně pomůžou.
Ta polemika je taky celkem divná. Ovšem nejzajímavější je, že v ní Čada za Javu “bojoval”, ale záhy otočil a začal ji vulgárně kritizovat a prosazovat jediné skvělé Objective-C (i když Java má smalltalkovské doesNotUnderstand, což u něj zásadně rozhoduje, jestli ten který jazyk za něco stojí).
Tolik širší kontext.
Popravdě po nějakých dvaceti letech v oboru to asi taky nechápu :-) Jde o to, CO to vlastně OOP je (neshodneme se ani na definici*). To co nás kdysi učili ve škole bylo class-based OOP. Přitom jsou jazyky, které jsou krásně OOP a třídy nepotřebují. A třeba multimetody to staví na hlavu už úplně :-)
* to stejné i pro FP
Osobní názor: IT obecně trpí dost jedním "zákonem", který zhruba říká: počet vývojářů se každých 5 let zdvojnásobí. V takovém prostředí se těžko předávají ty skutečně dobré myšlenky, protože i kdyby s nimi souhlasila řekněme polovina vývojářů, za 5 let z nich bude už jen malá skupina atd. atd.
Takže se v IT spíše postupovalo malými přískoky vpřed (někdy i úkroky stranou). Typicky je to vidět na Javě - jazyky navržený tak, aby na něj bylo možné relativně snadno přejít z tehdy dominantního C++. Dtto Kotlin - malá vylepšení v mezích zákona, postupné přidávání dalších featur.
O to víc mě překvapilo F#. Ne svojí existencí (MS research je v oblasti jazyků velmi dobrý*), ale že to nikdo ještě nezabalil s tím, že se pojede mainstream C#.
* fakt jsem MS pochválil? :-)
Problém (nejen) Microsoft Research je, že se moc nezabývají svými aktuálními praktickými technologiemi a ty pak mají malý inkrementální vývoj a stagnují. Prosadit nějaký výzkum týkající se třeba C# je skoro nemožné. Nehodné seriózního vědeckého bádání. Ono je hezké vymýšlet pořád nějaké revoluční technologie, ale ty se neprosadí, protože jsou moc revoluční a běžná praxe je pak desítky let pozadu.
No ono práveže najprv sa novinky dostávali skôr do F# (napr async expressions tam boli možno o 5 - 10 rokov skôr ako v C# async / await). Ale v poslednej dobe mi príde F# už dosť odladený a konzervatívny a prevratné novinky tam pridávajú ešte neskôr ako do C# a väčšinou tam pridávajú len drobné vylepšenia, ktoré si bežný programátor ani nevšimne (ja si what's new pri každej verzii prejdem lebo občas sa tam nájde niečo zaujímavé). F# je jednoducho dosť komplexný jazyk (je to také C++ medzi funkcionálnymi jazykmi s obrovským množstvom možností, kľúčových slov a podporovaných paradigiem) a novinky sa do neho pridávajú dosť ťažko a každá nová vlastnosť sa musí poriadne premyslieť aby bola spatne kompatibilná a preto sú často skôr v C#. Napríklad keď prišiel Swift od Apple, C#čko z neho okopoírovalo string interpolations zatiaľ čo do F# sa dostali až omnoho neskôr (cca o rok) https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/interpolated-strings, takže donedávna sme v F# (pri formátovaní reťazcov) ešte boli odkázaní na sprintf (ktoré ale typovo checkoval compiler). Mimochodom F# je spolu s inperatívnym C++ moj najobľúbenejší jazyk ale keď som si pozeral OCaml, tak ten mi prišiel omnoho konzistentnejší. OCaml má úplne inú OOP syntax, ktorá imho lepšie zapadá do prostredia jazykov z rodiny ML. (A má aj kopu ďalších vecí napríklad generické moduly, akurát žiaľ Ocaml má na druhej strane omnoho slabšie vývojárske tooly ako F#). F# musel kompletne prekopať OOP keďže musel robiť komromisy kôli .NETu a napriklad podpora interfaces je doslova divná. Ak chcem používať interface tak to musím pretypovať na interface typ čo je divné. Taktiež virtuálne metódy tam majú dosť divnú syntax treba si ich zadefinovať ako abstraktné atď.