No, kdyz mi po zkousce prisel e-mail, ze "Musel jsem snizit hranici bodoveho hodnoceni na 1/3 aby mohla 1/3 projit." me srdce zaplesalo, neb mich 12 ze 30 stacilo :-). Bez ohledu na to, vsak musim rici, ze funkcionalni programovani ma neco do sebe. Mnoho lidi vsak rezignuje hned na prvni prednasce, protoze prednasejici nebyl schopen zodpovedet uspokojive otazku: "K cemu je to dobre?". Tim apeluji na autora clanku, aby se mi pokusil na tuto otazku odpovedet a nejlepe podat i konkretni priklad. Treba, co presne se to v tom haskelu u toho Ericksonu dela? btw. clanek se libyl, tak platim ;-)
Neni mi zcela jasne, jakou maji funkcionalni jazyky vyhodu oproti jazyce Python. Vsechny vyhody, ktere jsou v clanku popsany, podle me plati i pro nej (snad krome toho lineho vyhodnocovani, ktere by se muselo udelat pres eval a take mozna zdrojak vyjde trosku delsi), a navic ma jednu - je take imperativni.
Python je shit. Kdyz jsem si o nem zacal cist, zdal se mi kozi, ale pak ty jeho spraseny "objekty" a dalsi praseciny. Fuj. Jasne ze i v hroznysovi se da neco udelat (v bezny praxi beznych lidi asi vic nez ve funkcionalnich jazycich), ale je to pomalu takovy patlani jako v perlu.
Hlavne nema clovek tak zajimavej pocit, jako kdyz si neco pise LISPu nebo necem podobnym (na Haskel se teprve vrhnu).
Co som sa z LISPu naucil.
1) Nauci vas to strukturovat program. Ked nemate cykly,
iba rekurziu, musite si kazdy cyklus nazvat.
2) Nauci vas to ocenit a pouzivat taku klasiku, ako su zoznamy. Velakrat je lepsie pouzit zoznam na mieste,
kde sa spravidla pouziva pole.
3) Spravidla ma funkcionalny jazyk mensie naroky na
interpretaciu nez proceduralny => idealne pre makra etc.
Tie makra nemusia byt primarne urcene pre uzivatelov,
staci, ked to umozni vam ako autorovi menit funkcnost programu bez nutnosti rekompilovat.
Teda nikdy jsem nic takovyho nevidel, takze mozna placam, ale rekl bych, ze tam je porad chyba (2) :-) Jestli ne, tak sorry...
qsort [] = []
qsort (x:xs) = qsort mensi ++ [x] ++ vesti_rovno
^-tady v tom radku je preklep
where
mensi = [ y...
vetsi = [ y...
^- a v tomhle radku by melo bejt vetsi_rovno = [... ne?
Existuje funkcionalni jazyk ML http://www.dina.kvl.dk/~sestoft/mosml.html
Ktery ma mimo jine binding na OpenGL a Gtk+ a melo by byt mozne zkompilovat ho mimo jine na Javovsky bytecode a tedy pouzit z Javy.
Jinak kdyz clovek jen trochu pochopi system funkcionalnich programovacich jazyku, tak je pak dost jednoduchy resit dost slozite problemy - treba zjednodusovani boolenovskych vyrazu na 160 radek vcetne komentaru.
Funkcionalni programovani asi moc nikoho zivit nebude, ale kdyz nekoho bavi premyslet...tak to je zabava.
Tak shrnu chyby v prokladu qsortu:
qsort [] = []
qsort (x:xs) = qsort mensi ++ [x] ++ qsort vetsi
> na druhou cast seznamu musime rekurzivne zavolat znova qsort a ten seznam se musi i spravne jmenovat - druha cast je v promenne vetsi!
__where
____mensi = [ y | y <- xs, y < x]
____vetsi = [ y | y odszeni je dulezite!
btw: na MFF UK taky zacina prednet "programovani II", ale zacina se prologem, nasleduje lisp a az na konci je haskell a ukaze se tento NADHERNY zapis qsortu.
Jestli si vzpominate na strilecku Abuse, tak ta mela pod DOSem (nevim jak jeji linuxova verze) adresare plny lispovskejch programku, kde se volala grafika a hudba. Jestli to v tom bylo napsany cely nevim, mozna jo, ale tehdy, kdyz jsem se LISP ucil na zkousku tak mi to docela zvedlo naladu. Tak to jen na okraj k "k cemu to je".
a) k cemu to je: vzhledem k tomu, ze kazdy program v ciste funcionalnim jazyce (pozn.: LISP neni ciste funckcionalni ale
kombinace imperativniho a funkcionalniho) je vyraz, MUZEME PROGRAM
SNADNO VERIFIKOVAT, tedy dokazat jeho spravnost
b)Gofer: mam za to, ze jde o interpret jiste formy Haskellu
c)pouziti: ano, pouziva se na makra, nemusi mit nizsi naroky za behu, ovsem interpret funckionalniho jazyka byva pomerne maly,
tedy je snadne ho nekam zabudovat
ja sa tu nejdem hadam k comu to je, svoj zmysel to ma a LISP a jeho dialekty (scheme a podobne) su silne vyuzivane aj v komercnej sfere, ale samozrejeme hlavne na akademickej pode a myslim, ze nikomu nazaskodi nejaky ten funkcionalny jazyk ovladat a vediet o com to je. V kazdom pripade musim povedat, ze velmi rad programujem v takychto jazykoch je to celkom zabavne ak vas uz cecko a podobne omrzelo. Osobne odporucam Scheme ;-).
Bylo by prosím možno upřesnit výrok:
>U aplikací, kde hraje rychlost provádění výsledného
>kódu hlavní roli, bude asi vždy lepší použít jazyk jako
>C.
Logicky vzato, při vyšší míře abstrakce a deklarativním přístupu by překladač měl mít více informací o záměru autora, což by mu mělo umožnit generovat efektivnější kód. Naopak v C je obecně dost těžké (někdy i pro kolegu vývojáře;-) zjistit, co přesně měl autor kódu na mysli a je tedy nutné s kódem zacházet mnohem opatrněji.
Proč tedy tvrdíte, že je tomu naopak? Nemáte spíše na mysli kvalitu běžně dostupných překladačů, které jsou v případě C velmi propracované?
Pane kolego, platí takový velmi neexaktní ale velmi fungující "zákon": Čím vyšší míra abstrakce, tím snadnější programování a méně efektivní kód.
Nejefektivnější kód napíšete v assembleru, v C je to horší, ale pořád slušné při rozumné míře abstrakce (možná vám to nepřipadne, ale když já byl odchován FORTRANem), ještě horší v Pascalu, mnohem horší v OOP, atd.
A ještě něco - překladači je čerta starého po tom, "co přesně měl autor kódu na mysli", ten převede přesně to, co autor napsal. A pokud ne, pryč s ním!
Ciste funkcionalni jakzyky jako je Haskell maji problem s tim jak vyjadrit stav neceho, prave protoze v nich nejsou promnenne. A svet kolem nas ma mnoho stavu, proto nejsou na vsechno vhodne. Stav lze reprezentovat pomoci predavani hodnoty mezi funkcema ktere ho mohou zmenit nebo pomoci 'continuacion' nebo 'monad', takove programy nejsou trivialni viz:
http://cm.bell-labs.com/cm/cs/who/wadler/topics/monads.html#marktoberdorf
Jinak soucasna implementace Haskellu tez neni zrovna moc vykonna:
http://www.bagley.org/~doug/shootout/craps.pl(na rozdil od jinych funkcionalnich jazyku viz. ocaml)