Diskuze: Cokoliv funkcionálně
Tvůrce
Zobrazeno 31 zpráv z 31.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Podle mě ano. Funkcionální jazyky budou mít stejnou výpočetní sílu jako Turingovy stroje a jako jazyky většině lidí asi bližší (Java, C#...). Koneckonců, existuje i model tzv. částečně rekurzivních funkcí, jehož síla odpovídá také TS... a to je funkcionální programování ve své nejpekelnější podobě.
Ono i ty funkcionální jazyky budou mít nějaké mechanismy na psaní na interakci s okolním světem. Co si myslím, že může být problém, je efektivnost. Přišlo mi, že napsat efektivně určité věci jde ve funkcionálním jazyce o dost hůře. Ale tento můj názor je třeba brát s rezervou, protože jsem funkcionálně programoval jen část jednoho semestru.
Jde jednoduše říct, co je výpočetní síla turingova stroje? Nebo to mám nastudovat na wiki?
Turingov stroj je model z teoretickej informatiky, pomocou ktorého sa dá čisto teoreticky naprogramovať čokoľvek (dá sa to myslím dokázať). K tvojej otázke, áno dá sa čokoľvek naprogramovať aj vo funkcionálnom jazyku, dokonca budeš možno prekvapený, ale princípy OOP sa dajú využívať aj vo funkcionálnom programovaní
Turingův stroj je takový "počítač" pro teoretické účely. Má následující součástky:
V každém taktu se TS podívá na svůj aktuální stav, načte znak z políčka pásky, nad kterým se právě nachází čtecí hlava. Na základě těchto dat provede jednu instrukci, která se může skládat z libovolné kombinace následujícího:
Tedy celkem jednoduchý koncept (proti naším notebookům třeba). Programuje se v tom dost mizerně (ale pořád lépe než ve výše zmíněných částečně rekurzivních funkcích), ale pro teorii je důležité, že ten stroj je jednoduchý, takže se o něm dá dokázat spousta věcí. Například to, že existuje tzv. univerzální TS, což je TS naprogramovaný tak, aby simuloval libovolný TS. Tohle v podstatě teoreticky dokazuje, že můžeš na svém hardware virtualizovat (simulovat) to samé "železo".
Zároveň se předpokládá, že jeho výpočetní síla (okruh problémů, které dokáže vyřešit, když jej naprogramujeme) se rovná výpočetní síle dnešních počítačů (to trochu kecám, ale pro tuhle diskuzi to zatím stačí).
Tzn. když se zjistí, že nějaký problém TS neumí rozumně řešit, tak ani nebude existovat algoritmus, který by jej rozumně řešil (tzn. někdy skončí a vyplivne výsledek). A nepůjde tedy naprogramovat ani v jiném libovolném jazyce, jehož síla je ekvivalentní s TS (asi neznám žádný reálný jazyk, který by tímto problémem netrpěl). A takové problémy jsou.
Výpočetní silou tedy myslím okruh problémů, které dokážeš pomocí daného jazyka/stroje vyřešit.
Turingův stroj je teoretický model, který je nesmírně jednoduchý, ale dá se dokázat, že jeho vyjadřovací síla odpovídá síle programovacích jazyků jako je např. C. Rozhodně (nejen v něm) nelze naprogramovat cokoliv, a to se dá dokázat, ale to souvisí s problémem rozhodnutelnosti, ale na to si ještě pár let počkej.
Funkcionální jazyky umožní naprogramovat cokoliv, co se dá naprogramovat
nejen pomocí OOP.
Funkcionální paradigma je velice výhodné, protože narozdíl od OOP vede k
tvorbě malých a jednoduchých komponent, které se dají velice snadno
otestovat a udržovat.
V posledních letech je funcionální paradigma na vzestupu zejména díky
datově orientovanému přístupu.
Jestliže základem aplikace jsou data, pak je velice intuitivní přístup
aplikovat na data funkci.
Narozdíl od OOP se tyhle výpočty dají snadno paralelizovat, takže aplikace
pak může běžet na řadě strojů najednou a bude daleko lépe škálovat.
Jestliže potřebuješ zpracovat terabyty nebo petabyty dat, na kvalitní
platformě to s FP bude nejen mnohem jednodušší.
Velká spousta aplikací se takhle už píše a dokonce i existují
databáze, které tenhle styl podporují.
Programování, které se většinou probírá na devbooku, je jen střípek
toho, co se používá v praxi, nenech se tím zmást.
K tomuhle taky rad neco dodam, funkcionalni programovani je podle me zazrak... koukni se na jazyk jako je LISP je to funkcionalne zalozeny jazyk, programujou se v tom vedecky veci, ma obrovskou silu, vsechno je funkce ..jak jinak... ale co je fatalni ...v LISPu se dela vetsina vedeckych AI ..coz je velky prekvapeni...jak je to mozny?
Jak to ze to nikdo nedela v objektovejch jazycich? Hmm asi na tom LISPu neco bude...uz vazne dlouho snim o tom, ze se ho budu ucit, a myslim, ze jesli se mi bude ve skole darit, tak se v lete odmenim nejakou prijemnou referenci a zalehnu k uceni (te male sondy do autorova zivota si nevsimejte, jen tise slinta nad AI) takze, podle me urcite jde delat milion a jedna vec ve funkcionalnich jazycich, dokonce jako clovek co doted nepochopil skvelost OOP (premyslim totiz proceduralne) mam pocit, ze na tom LISPu bude mnohem vic nez treba na Jave nebo na C# (fakt no hate, javu znam zblizka a C# se mi libi tim, ze ho tu pred par dny v diskuzi par lidi hodne rozebralo a ja si rekl hmm zajimavej jazyk...)
vidim, ze jsem se fakt rozepsal, snad jste si odnesli to co jsem chtel rict hlavniho .... LISP je funkcionalni, LISP je super, delaj se v nem AI a vedecky veci...podle me je to silnej jazyk i typ jazyka (shrnuti)
a udělal v LISPu někdo nějaký třeba redakční systém? Autor vlákna jako příklad uvedl, že ho zajímá jestli lze ve funkcionálních jazycích nějak reálně naprogramovat třeba eshop.
a udělal v LISPu někdo nějaký třeba redakční systém? Autor vlákna jako příklad uvedl, že ho zajímá jestli lze ve funkcionálních jazycích nějak reálně naprogramovat třeba eshop.
To sice nevím, ale co nám říkali při vybírání zápočtových programů na předmět neprocedurální programování (Prolog, Haskell), tak někdo ve funkcionálu naprogramoval třeba 3D střílečku.
Mně přijde, že na funkcionální programování prostě musíš myslet úplně jinak, protože máš k dispozici jiné prostředky (a věci jako proměnné či paměť se tak úplně nevyskytují).
Ono, i kdybys v tom nějaký ten eshop třeba naprogramoval, tak budeš mít problémy s hostingem. Takže je to aktuálně asi zajímavé spíš jako experiment.
Nevím, ale slyšel jsem o webovém frameworku pro Haskell
ja nejak nevidim potencial v tom, zahlcovat svet dalsima a dalsima redakcnima systemama vim, ze to spoustu lidi bavi a je to super neco takoveho mit.. ale ja jsem napsal, ze se v tom delaj vedecky AI ... to myslim prebije uplne jakejkoliv eschop, CMS, cokoliv jinyho ... AI je proste AI..proste TOP
ber to jen jako muj nazor, netvrdim, ze s nim musis souhlasit, ale ve me AI vyvola neco naprosto odlisneho nez jakykoliv jiny obor IT (spolu s VR a drony)
A proč zrovna Lisp, proč ne třeba Haskell?
Martine, (nejen) ty jsi mi v tady té diskusi normálně rozšířil obzory, díky
Naprogramovat jde cokoliv, ale bez vedlejších efektů těžko!
Proto odpověď zní: Ne, nejde!
Tohle žádný funkcionální (ani jiný) jazyk nezvládne.
Dovolím si položit otázku do pléna.
Kdo z vás, kteří jste odpovídali (kromě Coellse ) ví, co autor dotazu myslel
svými vedlejšími účinky, nebo spíš vedlejšími efekty?
A jak byste vy Turingovy stroje bez vedlejších efektů programovali redakční systém?
Vedľajšie účinky sú zmeny stavu premenných (akékoľvek priradenia), ono teoreticky sa dá povedať, že funkcionálne programovanie, je programovanie bez priradenia.
Ne! Jak přesně by sis to představoval?
Pokud myslíš třeba změnu globální proměnné ve funkci, pak ano, to je
vedlejší efekt. Ale bez toho se dá žít
Kdo to zkusí znovu?
Malá nápověda:
Proč by ti právě tohle mělo bránit programovat redakční systém?
A proč ne? No, výstup programu je vlastně taky vedlejší efekt že. Takže by se musela udělat výjimka ve hlavní funkci, která by neměla nic jiného než vedlejší efekty Ale je to vedlejší efekt, když tam není nic jiného?
Přesně tak, pokud výstupem programu myslíš výpis do konzole apod. To je vedlejší efekt.
Důvod, proč se bez vedlejších efektů nedá naprogramovat např. redakční systém je ovšem také to, že potřebuješ provádět čtení a zápis do databáze (ať už v jakékoliv podobě).
Pro pochopení principu funkcionálního programování je nutné mimo jiné pochopit princip ryzích funkcí a princip neměnnosti objektů.
Jako vedlejší efekty můžete počítat mimo jiné:
1/ I/O operace (čtení a zápis do souboru),
2/ zápis a čtení globálních proměnných uvnitř funkce,
3/ některé volání funkce uvnitř funkce, jako typický příklad je nějaká
inicializace, která nemá vliv na samotný výsledek funkce, ale změní
vnitřní stav programu,
4/ vyvolání výjimek a jejich zachytávání mimo funkci,
5/ generátor náhodných čísel rozhodně není ryzí funkce,
6/ apod.
Mimochodem,
pokud miluješ želví programování a momentálně se zajímáš o funkcionální programování, nenech si ujít toto:
Slovní spojení "bez vedlejších efektů" jsem bral s rezervou, protože mi to v doslovném znění nedávalo ve spojitosti s funkcionálními jazyky příliš smysl. Nemyslím si, že se přesně na tohle tazatel ptal.
Takže jsem se omezil na neměnnost datových struktur a funkce.
Aha, takze program bez vedlejsich ucinku je vlastne nepouzitelny Ciste funkcionalni jazyky tedy
vedlejsi efekty ne ze nemaji, ale spis je omezuji a IO atd. se deje nekde
bokem?
Dik za odkaz.
Vyhnout se vedlejším efektům je základní dogma funkcionálního přístupu. Nicméně stejně jako v reálném světě nejsou všechny objekty neměnné (jako například databáze, dnešní datum a čas apod), tak se nelze bez vedlejších efektů obejít ani v případě funkcí.
Proto může být výhodné používat smíšený přístup a podle potřeby míchat prvky jednotlivých paradigmat jako to dělá Scala, Python nebo Fsharp. Dokonce i "moderní" PHP to dělá! Sice blbě, ale dělá
Treba jen proto, ze puvodni LISP side effects vubec neobsahoval... jinymi slovy protoze mi prijde zajimavejsi (subjektivne) nez haskell
Asi tak nějak.
Pokud chceš zjistit, jak řeší tyhle věci ryze funkcionální jazyky jako
Haskell, můžeš si přečíst něco o monádách:
http://homepages.inf.ed.ac.uk/…/baastad.pdf
Také se můžeš zajímat o matematické základy FP:
https://en.wikipedia.org/…bda_calculus
Anebo si prostě procházej články od Scotta Wlaschina, ten se snaží o opravdu srozumitelný výklad. Jinak funkcionální přístup se momentálně řeší v každém jazyce:
http://www.oreilly.com/…g-python.csp
http://shop.oreilly.com/…937785468.do
http://shop.oreilly.com/…920028857.do
http://shop.oreilly.com/…470744581.do
Ale samozřejmě ne každý jazyk podporuje FP stejně.
Haskell je také ryzí (pure) funkcionální jazyk. Ale to neznamená, že se nemusíš vypořádávat s vedlejšími efekty - viz mé příspěvky výše. Proto také můj odkaz na monády.
Jojo ..ja s tebou vubec nemam duvod nesouhlasit, dokonce na ukor LISPu reknu,
ze on prave patri primarne mezi hybridni, takze ho tu vlastne tak trochu
protlacuju na silu ... ale je
to jen proto, ze ja mam fixni ideu, ze jednou si stvorim nejakou vlastni AI (co
bude delat neco poradne AIckovyho) a kdyz jsem se pred casem docetl, ze se LISP
hojne vyuziva k programovani AI tak jsem tomu proste propadl, vim toho o nem
zatim jen malo, takze jedinej duvod proc jsem ho zminil a mluvim o nem je moje
naklonost k nemu a to ze ho prede mnou (pokud se nepletu) nikdo nezminil...
takze jsem se sem spis prisel neco priucit (do tohohle vlakna)
za spoustu informaci co jsem tady nasel, bych chtel podekovat jak autorovi
vlakna, protoze ja bych se asi jen tak nezeptal i vsem ostatnim
Pokud tě tak láká LISP, tak by ses měl podívat na Clojure:
https://cs.wikipedia.org/wiki/Clojure
Ale jinak přesně nerozumím, proč právě LISP?
https://wiki.python.org/…Intelligence
V každém případě se obávám, že na tohle téma se tady moc nedozvíš
na clojure se chystam uz delsi dobu tak doufam, ze to po zkouskovym vezmu vsechno najednou ... nevim proc LISP, je to jakysi zajem, kdyz jsem videl sintax, kdyz jsem zjistil, ze neco jako funkcionalni programovani existuje bylo to prave pres LISP, ziskalo si me to... a Pythonu se obavam proto, ze jsem zvyklej na C like sintax a kdyz jsem se naposledy ucil Python (nutno poznamenat, ze uz je to par let) tak me to dost bolelo , ale ono i na nej casem dojde, protoze at chci nebo nechci tahne me to k nemu skrz tu jeho otevrenost a propojenost s GNU
ďakujem za objasnenie ale databáza sa dá určitým spôsobom úplne oddeliť od samotnej aplikácie nie? Keď to bude iba plugin do aplikácie, čiže aplikácia nebude nijakým spôsobom závisieť od databázy, potom by sa to dalo, či?
V zásadě uvažuješ správně. FP vyžaduje neměnnost, tj. objekty s pevným vnitřním stavem. Pouze takový objekt ti zaručí, že se bude ryzí funkce chovat, jak má. Tj. pro jeden konkrétní vstup vždy jeden konkrétní výstup.
Databáze (a její tabulky a náhledy) jsou z logiky věci objekty, které se mění. To je ale i souborový systém, okolní svět (včetně systémového data a času či doba zapnutí počítače). Stejně tak již zmíněná náhodná čísla, které s tímhle souvisí. Webové služby, uživatelské vstupy atd.
Svět se mění, je dynamický. Programátor musí teoreticky předpokládat a ošetřit veškeré vstupy, což je samo o sobě dost náročný, ne-li nemožný úkol.
OOP se svým přístupem pak celou situaci spíš komplikuje, protože zavádí řadu objektů s nepředvídatelným vnitřním stavem, takže programátor nejenže musí ošetřovat sumu vstupů z vnějšku, ale i z vnitřku aplikace.
O funkcionálních jazycích FP propagandisté tvrdí, že pokud program zkompiluješ, pak je v pořádku. Funkcionální jazyk ti nedovolí vytvořit si v programu takový zmatek, jaký ti dovolí udělat OOP, proto by měl být výsledný produkt (a opravdu bývá) méně zabugovaný.
Na druhou stranu se v OOP snáz dělá například s GUI, protože typické uživatelské okno je objekt, který se neustále mění. Proto existují jazyky, které jsou multiparadigmatické.
Otázka ovšem je, zda programátor, odchovaný OOP, bude využívat FP prvky jazyka, protože je zvyklý uvažovat jinak. FP totiž vyžaduje od programátora zásadní posun v myšlení a podle mne i hlubší porozumění principu, co od něj FP vyžaduje.
Zobrazeno 31 zpráv z 31.