Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Jde cokoliv, co jde naprogramovat objektově i funkcionálně? Napadá mě třeba eshop, různý systémy... ?Funkcionálně myslím funkcionálně, bez vedlejších účinků.

 
Odpovědět 8. ledna 21:16
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:

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.

Nahoru Odpovědět 8. ledna 21:43
2 + 2 = 5 for extremely large values of 2
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:

Jde jednoduše říct, co je výpočetní síla turingova stroje? Nebo to mám nastudovat na wiki?

 
Nahoru Odpovědět 8. ledna 21:53
Avatar
Jaro
Člen
Avatar
Odpovídá na Ondřej Krsička
Jaro:

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í :)

Nahoru Odpovědět  +1 8. ledna 22:03
A ship is safe in harbor. But then again, that´s not what ships are for.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:

Turingův stroj je takový "počítač" pro teoretické účely. Má následující součástky:

  • Vnitřní stav, což je číslo udávající, v jakém stavu se stroj právě nachází. Můžeš to chápat jako jakousi vnitřní paměť... ale konečné velikosti.
  • Pásku, která se skládá z potenciálně nekonečna políček, na kterých mohou, ale nemusí být něco zapsáno.
  • Čtecí hlavu, která dovoluje zapisovat či číst z pásky data. Ale vždy jen z políčka, nad kterým se právě nachází.

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:

  • změna vnitřního stavu na jiný (jiné číslo),
  • zápis nového znaku na políčko pásky, kde se právě nachází čtecí hlava,
  • posun čtecí hlavy o jedno políčko vlevo/vpravo.

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.

Editováno 8. ledna 22:34
Nahoru Odpovědět  +2 8. ledna 22:33
2 + 2 = 5 for extremely large values of 2
Avatar
coells
Redaktor
Avatar
coells:

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.

 
Nahoru Odpovědět  +2 8. ledna 22:54
Avatar
Taskkill
Redaktor
Avatar
Taskkill:

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)

 
Nahoru Odpovědět 8. ledna 23:43
Avatar
Odpovídá na Taskkill
Michal Žůrek (misaz):

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.

Nahoru Odpovědět 9. ledna 0:02
Nesnáším {}, proto se jim vyhýbám.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Martin Dráb:

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.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 9. ledna 0:16
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Michal Žůrek (misaz)
Jakub Šárník:

Nevím, ale slyšel jsem o webovém frameworku pro Haskell

 
Nahoru Odpovědět 9. ledna 0:18
Avatar
coells
Redaktor
Avatar
coells:

Ale no tak, máte google, ne?
Hledejte Scalu, Erlang, Clojure, F#, ...
Nevím, jestli tyhle firmy znáte, ale třeba Facebook, Twitter nebo LinkedIn je hojně používají.
Případně jsou v nich napsané systémy, které využívají.

 
Nahoru Odpovědět 9. ledna 0:29
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Taskkill:

ja nejak nevidim potencial v tom, zahlcovat svet dalsima a dalsima redakcnima systemama :D 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)

 
Nahoru Odpovědět 9. ledna 1:19
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Taskkill
Ondřej Krsička:

A proč zrovna Lisp, proč ne třeba Haskell?

 
Nahoru Odpovědět 9. ledna 11:03
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:

Martine, (nejen) ty jsi mi v tady té diskusi normálně rozšířil obzory, díky :-)

 
Nahoru Odpovědět 9. ledna 11:05
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Ondřej Krsička
hanpari:

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?

 
Nahoru Odpovědět 9. ledna 11:27
Avatar
Jaro
Člen
Avatar
Odpovídá na hanpari
Jaro:

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.

Nahoru Odpovědět 9. ledna 11:42
A ship is safe in harbor. But then again, that´s not what ships are for.
Avatar
hanpari
Redaktor
Avatar
hanpari:

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?

 
Nahoru Odpovědět 9. ledna 11:54
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na hanpari
Ondřej Krsička:

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?

 
Nahoru Odpovědět 9. ledna 12:30
Avatar
hanpari
Redaktor
Avatar
hanpari:

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.

 
Nahoru Odpovědět 9. ledna 13:08
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Ondřej Krsička
hanpari:

Mimochodem,

pokud miluješ želví programování a momentálně se zajímáš o funkcionální programování, nenech si ujít toto:

http://fsharpforfunandprofit.com/…at-a-turtle/

 
Nahoru Odpovědět 9. ledna 13:10
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na hanpari
Martin Dráb:

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.

Nahoru Odpovědět  +1 9. ledna 13:33
2 + 2 = 5 for extremely large values of 2
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na hanpari
Ondřej Krsička:

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.

 
Nahoru Odpovědět 9. ledna 13:44
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Martin Dráb
hanpari:

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á :)

 
Nahoru Odpovědět 9. ledna 13:45
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Taskkill:

Treba jen proto, ze puvodni LISP side effects vubec neobsahoval... jinymi slovy protoze mi prijde zajimavejsi (subjektivne) nez haskell

 
Nahoru Odpovědět  +1 9. ledna 13:53
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Ondřej Krsička
hanpari:

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ě.

 
Nahoru Odpovědět 9. ledna 14:01
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Taskkill
hanpari:

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.

 
Nahoru Odpovědět 9. ledna 14:03
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na hanpari
Taskkill:

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

 
Nahoru Odpovědět 9. ledna 14:53
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Taskkill
hanpari:

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íš :)

 
Nahoru Odpovědět 9. ledna 15:10
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na hanpari
Taskkill:

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 :D, 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

 
Nahoru Odpovědět 9. ledna 15:20
Avatar
Jaro
Člen
Avatar
Odpovídá na hanpari
Jaro:

ď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?

Nahoru Odpovědět 9. ledna 15:34
A ship is safe in harbor. But then again, that´s not what ships are for.
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Jaro
hanpari:

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 multiparadigma­tické.

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.

 
Nahoru Odpovědět  +1 9. ledna 16:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 31 zpráv z 31.