Učím se pěkný funkcionální... no, vlastně jenom jazyk :-)

Když se mi porpvé zalíbil Haskell a jala jsem se opatrně zabrousit do větších hlubin než nabízel předmět Neprocedurální programování, který mě k němu zavedl, monádám jsem se raději opatrně vyhnula, protože neproniknutelné texty o teorii kategorií a obskurní operátory na mě působily poněkud strašidelně. Tam, kde to jinak nešlo (totiž u IO) jsem se tu omáčku okolo naučila používat, myslela si cosi o kostrbatých pokusech nadefinovat si pořadí operací jak v céčku a radši si s tím moc nelámala hlavu.

Letos jsem si zapsala další přednášku z Haskellu a nezbylo, než se pokusit s tou mystikou okolo nějak porvat... načež se ukázalo, že tam vlastně žádná není. Za nakopnutí správným směrem děkuji zejména následujícím článkům (tento blog si píšu hlavně proto, abych na ně nezapomněla): Monads for the Working Haskell Programmer, You Could Have Invented Monads! (And Maybe You Already Have.), A newbie in Haskell land or another monad tutorial.

Zatím si spíš jen tak hraju s Haskellem coby zajímavým imperativním jazykem :-), než abych tvořila něco užitečného. Chcete nějaký příklad? Hleďme, for cyklus...

for from cmp to what | from `cmp` to = what >> for (from `op` 1) cmp to what
                     | otherwise = return ()
                     where op = if (1 `cmp` 2) then (+) else (-)

main = for 0 (<) 5 $ do putStrLn "Hello World!"

W00T! Kyo (12. 11. 2007 - 18:02) Sbalit(5)
Hmm, že bych přeci jen zkusil kromě Scheme i něco dalšího? ;-) Že bych na ty přednášky přeci jen začal chodit? ;-)
No ja Ti to rikam porad anicka (12. 11. 2007 - 18:40) Sbalit(4)
No ja Ti to rikam porad :-)))
Ach jo, zkusim ve ctrtek Anonym (12. 11. 2007 - 19:37) Sbalit(3)
Ach jo, zkusim ve ctrtek prijit. ;-) Nejak jste me uz asi dostali. :)
Moc rada Te uvidim, jen se anicka (12. 11. 2007 - 19:43) Sbalit(2)
Moc rada Te uvidim, jen se mozna predem domluv s prednasejicim :-)
Už jsem se domluvil a nic Kyo (12. 11. 2007 - 22:54) Sbalit(1)
Už jsem se domluvil a nic tomu nebrání. ;-)
Já se v Neprocedurálním Martin Petr (12. 11. 2007 - 19:56) Sbalit(9)
Já se v Neprocedurálním programování zatím seznámil jen s Prologem a za ten měsíc už jsem si ho stihl dost oblíbit. Sice mi ještě spousta věcí uniká, ale to se snad zlepší. Doufám, že až za dva týdny konečně začneme s Haskellem, tak se mi bude líbit ještě víc než Prolog, fakt se na něj těším. :o) Jsem rád, že to, co jsem se kvůli vlastní lenosti nestihl naučit sám, mě teď "přinutí" se naučit tady na Matfyzu. :o) Škoda jen, že na Scheme nezbyde moc času...
Na Scheme nam zbylo spis nic anicka (13. 11. 2007 - 21:37) Sbalit(8)
Na Scheme nam zbylo spis nic nez moc (jedna prednaska, zadne cviceni), ale imho to neni zadna zvlastni skoda. Z Prologu jsem nikdy nebyla moc na vetvi, ale Haskell... to je jina :-)
Ke Scheme (obecně jazykům Martin Petr (14. 11. 2007 - 17:54) Sbalit(7)
Ke Scheme (obecně jazykům LISPové rodiny) mám takový zvláštní vztah. Neumím v nich (zatím) napsat prakticky nic, ale hrozně se mi líbí (myšleno na pohled :o)).

V Haskellu jsem se nedostal při samostudiu moc daleko, ale už od začátku se mi ten jazyk moc líbil, stejně jako Prolog. Mám rád zajímavé a originální věci a to tyhle jazyky určitě jsou (i když spousta kolegů je třeba Prologem dost znechucena :o)).
Pokud jde o me a Prolog, anicka (14. 11. 2007 - 19:54) Sbalit(4)
Pokud jde o me a Prolog, jsem rada, ze to zatim skoncilo jen u jednoho zapoctaku... na neco malo veci se nadherne hodi, ale IMHO jakmile pouzijes vykricnik, muzes si byt jist, ze udelas lepe, kdyz to zkusis napsat v Haskellu.

Ale uz jsem parkrat premyslela, ze napisu v Prologu reseni nejake ulohy, s kterou jsem se setkala na sifrovackach... proste, je fajn ho umet pouzit, je na nic muset v nem psat veci, na ktere se moc nehodi.
Jo, přiznávám, že když Martin Petr (14. 11. 2007 - 21:29) Sbalit(3)
Jo, přiznávám, že když jsme vybrousili z toho opravdu čistého Prologu k vykřičníkům a podobným věcem, byl jsem trochu zklamán. :o)

Na Tvůj zápočťák se určitě mrknu, rád se podívám na něco trochu většího, než je násobení matic, největší to program, který jsem dosud v Prologu stvořil. :o))) Já asi zkusím udělat nějaký sudoku solver, i když ještě nevím jak. Sudoku jsem doteď neluštil ani v novinách. :o)
Kdybych psala zapoctak ted, anicka (14. 11. 2007 - 21:40) Sbalit(2)
Kdybych psala zapoctak ted, asi zkusim neco zajimavejsiho nez mrzkou gamesu, zkusit napsat dost rychle nejaky algoritmus na toky v sitich by mohla byt docela zabava. Jenze holt jsem mela Prolog driv nez obe ADS i kombagru, takze lepsich napadu nebylo. (No, pokud jde o datove struktury, nakonec to byla bzunda i tak.)

Ale asi si to ted vynahradim a zapoctak na algoritmy napisu v Haskellu :-)
XrhHnOmKZrIfoN utdwmhag (22. 7. 2010 - 11:30) Sbalit(1)
b5KMmG <a href="http://mocirozfsiss.com/">mocirozfsiss</a>, [url=http://aiyoxaasoscs.com/]aiyoxaasoscs[/url], [link=http://dtpgcrzjihuz.com/]dtpgcrzjihuz[/link], http://lxbsbhnseduj.com/
"Haskell" a "Prolog" primo v Lispu... :o) Kyo (20. 11. 2007 - 8:39) Sbalit(2)
Jeste mala poznamecka: "Haskell" a "Prolog" (resp. vestavene jazyky primo v Lispu) muzes prinejmensim pro nekolik implementaci Common Lispu ziskat v podobe knihovny Qi: http://www.lambdassociates.org. Nektere myslenky vystihuje stranka http://www.lambdassociates.org/lC21.htm. Mne se to docela libi. :-) A pritom to neni ani moc velke, cele to ma tak mozna sest tisic radku kodu samo v sobe.
Proc jsi vlastne nakonec anicka (20. 11. 2007 - 16:16) Sbalit(1)
Proc jsi vlastne nakonec nedorazil? Prisel si o silene divadlo o Cabalu :-))
komentare joejoe (9. 11. 2007 - 15:03) Sbalit(2)
Kdyby byl kod okomentovany, tak by mu treba rozumel i ten kdo zna jenom smalltalk a c++
Ale kdyz ono na tom neni moc anicka (9. 11. 2007 - 20:59) Sbalit(1)
Ale kdyz ono na tom neni moc co komentovat ;-)
Proste to prvni je ponekud obskurni pokus o implementaci for cyklu (a kdo neumi Haskell, tomu tam komentare vubec nepomuzou) a funkce main ho pak pouziva na pet vypsani magickeho stringu. Jasne, mezi mym "for 0 (<) 5 $ do" a ceckovym "for (i=0; i<5; i++)" je mirny rozdil, ale nemelo by to byt neproniknutelne :-)
Bojim Vojtěch Kopal (12. 12. 2007 - 12:55) Sbalit(2)
Tak tohle me dostatecne vydesilo. :) No, mam se na co tesit v budoucnu.
Tohle uz povinne neni :-) anicka (13. 12. 2007 - 15:02) Sbalit(1)
Tohle uz povinne neni :-) Povinne se uci jen o neco krotci cast Haskellu :-)
A co ten for dělá? Na můj Pepa (8. 11. 2007 - 19:19) Sbalit(6)
A co ten for dělá? Na můj vkus je moc ošklivej...
No nijak zvlast pekny na anicka (8. 11. 2007 - 19:28) Sbalit(5)
No nijak zvlast pekny na pohled neni... ale stejne porad dovede to same co for cyklus z pascalu. Asi jsem jeste misto operatoru mela nadefinovat spis `to` a `downto` aby to vypadalo trochu min divne.

Ale hlavne je to cele uplne k nicemu, spis jsem chtela ukazat, na cem se zrovna ucim tomu vsemu rozumet :-)
Mno... nevim jestli delas dobre s tim cyklem Ondra (19. 1. 2008 - 14:22) Sbalit(4)
Mno... nevim jestli delas dobre, kdyz se snazis si hrat se striktne funkcionalnim jazykem jako s imperativnim. Ja sem par let cvicil na FI MU Uvod do funkcionalniho programovani a nejvetsi problem vetsiny studentu byl prave v tom, ze se snazili za kazdou cenu napasovat to, co vedeli o programovani (v Pascalu/C/PHP/Delphi/whatever), na Haskell.


Funkcionalni programovani je zvlastni a zajimave prave v tom, ze vyzaduje odlisne premysleni nez imperativni pristup. Takze bacha ;-)). Ne vazne, jestli se ucis tomu rozumet, tak Ti vrele doporucuju vzit si nejaky trivialni problem, treba zobrazit prvnich sto sudych cisel (tri priklady delajici totez):


  • take 100 (filter (even) [1..])

  • take 100 [ x | x <- [1..], even x ] -- intenzionalni seznam [ E | G, P ], kde E je vyraz, G je generator prvku a P je podminka, ktera je filtruje

  • let s = flip take . filter even in s [1..] 100 -- prvni vyraz v eta redukovane forme s let, je tam hromada implicitnich zavorek, ktere sem vynechal, protoze asociativita funguje :)



Pockej, az potkas v Haskellu monady :). A zapomen na cykly... ;).
Prece jen, uz mam za sebou anicka (20. 1. 2008 - 17:06) Sbalit(3)
Prece jen, uz mam za sebou uvod do neproceduralniho programovani, kde jsem Haskell jinak nez funkcionalne ani nepouzivala. Napsala jsem asi tak milion programku, ktere si o monadach mohou nechat leda tak zdat... (jeden z nich, zrovna je na nem videt jak jsem se to vsechno ucila, dokonce i neco aspon trochu uzitecneho dela).

Myslim, ze na hrani s monadami (ten kus zdrojaku samozrejme monady pouziva) uz prece jen prisel cas, ani bych bez nich neudelala zkousku :-) A pokud jde o jednoduche ulohy a ruzne zpusoby reseni... prubezne se snazim rozumet jednotlivym resenim oblibeneho faktorialu a je to obcas zatracene tezke, ale prima zabava.
Faktorial Ondra (21. 1. 2008 - 4:02) Sbalit(2)
Tak tenhle web sem neznal. Diky za odkaz :-D. Vymenim za lambdu :).
Tim ze mam po ruce anicka (21. 1. 2008 - 10:20) Sbalit(1)
Tim ze mam po ruce Kyosukeho, je dost tezke me obdarit odkazem na cokoliv, co souvisi s funkcionalnim programovanim a ja to jeste nevidela, ale stejne diky ;-)
Jo, a proč mi to říká, Pepa (8. 11. 2007 - 19:19) Sbalit(2)
Jo, a proč mi to říká, že jsem spam?
Eh... to vypada, ze bayes uz anicka (8. 11. 2007 - 19:24) Sbalit(1)
Eh... to vypada, ze bayes uz tak dlouho nedostal ham, ze povazuje vsechno za spam (spamu chodi denne desitky kousku)... je mi to lito. Nastesti jsem Te ted chytla vcas, jinak se zachycene spamy za hodinu mazou :-(

Ale co uz, uz mam naspecifikovany zapoctak, ktery mi snad umozni z techto problemu vybrednout...
Hezké, jen to na první m4r3k (8. 11. 2007 - 20:23) Sbalit(1)
Hezké, jen to na první pohled vypadá složitě :-)
:wq
"pěkný" Martin Vidner (8. 11. 2007 - 21:14) Sbalit(2)
Ha! A pak že YCP je obskurní jazyk!
Pokud jde o obskurnost anicka (8. 11. 2007 - 21:40) Sbalit(1)
Pokud jde o obskurnost YCP... jak nedavno nekdo posilal na maso ten kus YCP zdrojaku... pochopila jsem z nej spravne, ze se tam pole indexuji stringy? :-)

Koukam, ze antispam ted pozira jako spam uplne vsechno, ale s ani ne jednim hamem a 300 spamy za den mu to tezko zazlivat... takze vypinam automaticke mazani spamu po hodine a chybne oznacene prispevky se pokusim cas od casu rucne zachranovat.