Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondřej Krsička:8.1.2016 21:16

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.1.2016 21:16
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:8.1.2016 21:43

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.1.2016 21:43
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:8.1.2016 21:53

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.1.2016 21:53
Avatar
Jaro
Člen
Avatar
Odpovídá na Ondřej Krsička
Jaro:8.1.2016 22:03

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
8.1.2016 22:03
“What would you do if you were 100% sure you couldn’t fail?”
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:8.1.2016 22:33

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.1.2016 22:34
Nahoru Odpovědět
8.1.2016 22:33
2 + 2 = 5 for extremely large values of 2
Avatar
coells
Tvůrce
Avatar
coells:8.1.2016 22:54

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
8.1.2016 22:54
Avatar
Neaktivní uživatel:8.1.2016 23:43

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.1.2016 23:43
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Žůrek - misaz:9.1.2016 0:02

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.1.2016 0:02
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Martin Dráb:9.1.2016 0:16

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.1.2016 0:16
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Michal Žůrek - misaz
Neaktivní uživatel:9.1.2016 0:18

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

Nahoru Odpovědět
9.1.2016 0:18
Neaktivní uživatelský účet
Avatar
coells
Tvůrce
Avatar
coells:9.1.2016 0:29

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.1.2016 0:29
Avatar
Odpovídá na Michal Žůrek - misaz
Neaktivní uživatel:9.1.2016 1:19

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.1.2016 1:19
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Ondřej Krsička:9.1.2016 11:03

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

 
Nahoru Odpovědět
9.1.2016 11:03
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:9.1.2016 11:05

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

 
Nahoru Odpovědět
9.1.2016 11:05
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
hanpari:9.1.2016 11:27

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.1.2016 11:27
Avatar
Jaro
Člen
Avatar
Odpovídá na hanpari
Jaro:9.1.2016 11:42

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.1.2016 11:42
“What would you do if you were 100% sure you couldn’t fail?”
Avatar
hanpari
Tvůrce
Avatar
hanpari:9.1.2016 11:54

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.1.2016 11:54
Avatar
Odpovídá na hanpari
Ondřej Krsička:9.1.2016 12:30

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.1.2016 12:30
Avatar
hanpari
Tvůrce
Avatar
hanpari:9.1.2016 13:08

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.1.2016 13:08
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
hanpari:9.1.2016 13:10

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.1.2016 13:10
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na hanpari
Martin Dráb:9.1.2016 13:33

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
9.1.2016 13:33
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na hanpari
Ondřej Krsička:9.1.2016 13:44

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.1.2016 13:44
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Martin Dráb
hanpari:9.1.2016 13:45

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.1.2016 13:45
Avatar
Odpovídá na Ondřej Krsička
Neaktivní uživatel:9.1.2016 13:53

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

Nahoru Odpovědět
9.1.2016 13:53
Neaktivní uživatelský účet
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
hanpari:9.1.2016 14:01

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.1.2016 14:01
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
hanpari:9.1.2016 14:03

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.1.2016 14:03
Avatar
Odpovídá na hanpari
Neaktivní uživatel:9.1.2016 14:53

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.1.2016 14:53
Neaktivní uživatelský účet
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
hanpari:9.1.2016 15:10

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.1.2016 15:10
Avatar
Odpovídá na hanpari
Neaktivní uživatel:9.1.2016 15:20

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.1.2016 15:20
Neaktivní uživatelský účet
Avatar
Jaro
Člen
Avatar
Odpovídá na hanpari
Jaro:9.1.2016 15:34

ď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.1.2016 15:34
“What would you do if you were 100% sure you couldn’t fail?”
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na Jaro
hanpari:9.1.2016 16:16

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