pyvec / zapojse

Get involved! Ideas and To-Do of the Czech Python user group / Zapoj se! Nápadníček a To-Do českých Pythonistů
https://python.cz/zapojse
22 stars 1 forks source link

Funkcionální programování - notebook #38

Closed hanpari closed 7 years ago

hanpari commented 7 years ago

Ahoj všichni,

jak už jsem psal Honzovi, svého času jsem začal psát notebook o FP, který je tady:

https://github.com/hanpari/veledatacz/blob/master/funkcionalne.ipynb

Nevím, zda za to stojí, ale pokud by to někdo chtěl posoudit, zda na té věci dál pracovat (ve smyslu, že by byla užitečná pro komunitu), budu jen rád.

Upozorňuji, že notebook je v syrovém a nedodělaném stavu. :)

encukou commented 7 years ago

Ahoj! Já si při čtení stále kladl zásadní otázku: Pro koho ten text píšeš? Jaké znalosti předpokládáš – Python, matematiku, Excel, časovou náročnost algoritmů, ...? Úroveň znalostí ve skutečnost není "úroveň"; každý se k tomu, co ví, dobral jinou cestou. Připadá mi že text je pro klasického vysokoškoláka na IT oboru (kde se FP typicky bere) nebo ostříleného profíka, který si udržuje o oboru obecný rozhled (a tudíž už se pravděpodobně s FP někde setkal).

Vyřešíš-li tuhle otázku, přijde další: Jak jako čtenář poznám, že text je pro mně, t.j. že mu budu rozumět a zároveň mi něco nového dá?

hanpari commented 7 years ago

Ahoj, díky, že sis našel čas. To jsou dobré otázky.

V podstatě jsem chtěl demonstrovat principy FP na jednoduchých příkladech. Pokud možná srozumítelnou a jednoduchou formou, aniž bych se zapletl do technického žargonu. Je pravda, že jsem odbyl motivační část :) Nakonec jsem četl tolik FP propagandy, že mi přijde, že to musí znát každý :) Ale ano, měl bych na začátek dát výhody FP, abych nemátl čtenáře.

Co se týče znalostí, matematika je spíš středoškolská, nějaké základy algoritmizace jsem u programátorů předpokládal a Python alespoň na mírně pokročilé úrovni.

Ještě jednou díky za čas. Zkusím se nad tím zamyslet. Budu jen rád za nějakou zpětnou vazbu.

horejsek commented 7 years ago

Ahoj. :-) Přijde mi, že je potřeba si nejprve stanovit cílovku, jak už psal @encukou, a podle toho text přizpůsobit.

Osobně, jestli jde o ukázání FP Pythonistům, držel bych se Pythonových konvencí a snažil se maximálně najít různé real-life ukázky, jak se řeší s OOP a jak je lze vyřešit elegantněji s FP technikami dostupnými v Pythonu.

Pokud jde o ukázání FP obecně, nejsem si jist, zda je Python správnou volbou. Ale na to bude mít každý jiný názor a já jsem ovlivněn tím, že mám rád Haskell. Minimálně bych byl rád, aby se nepřekládaly zavedené pojmy. Například ryzí mi docvaklo hned, ale objekty první třídy mi trvalo déle, cože to vlastně je. :-)


Mimochodem mohu doporučit jednu ukázku, která lze použít vhodně v běžném Pythonu a použil jsem před pár dny. Využít více deklarativní styl. Například řekněme, že máme list nějakých instancí a pro každý typ je třeba zavolat nějakou funkci ke zpracování. Někdo by mohl napsat takto:

def process(item):
    if item.type == 'a':
        process_a(item)
    elif item.type == 'b':
        process_b(item)
    ...

Kdežto například v Haskellu by šlo napsat hezky deklarativně:

process item@(Item 'a' _) = ...
process item@(Item 'b' _) = ...
...

Tedy bez nutnosti psát pomocnou metodu s dlouhou podmínkou. V Pythonu se lze deklarativnímu přístupu přiblížit třeba takto:

ITEM_TYPE_TO_PROCESS_FUNCTION = {
    'a': process_a,
    'b': process_b,
}

def process(item):
    ITEM_TYPE_TO_PROCESS_FUNCTION[item.type](item)

Samozřejmě to lze, v případě že známe dobře možné typy, udělat plně dynamické. Ale to je pak na posouzení, zda to za to stojí, neb v Pythonu se bude případný bug ladit blbě. Haskell naopak zařve, pokud nevyřešíme všechny možnosti.

hanpari commented 7 years ago

Určitě děkuji za další připomínku. Moc si toho vážím.

Pokud jde o cílovou skupinu, pak v podstatě mi šlo o osvětu. :) Lidé neví, co si pod pojmem funkcionálním představit a na rootu jsem viděl dokonce komentář, ve kterém si kdosi zjevně pletl funkcionální s procedurálním a nenašel se nikdo, kdo by ho opravil :)

Co se týče překládání, tam bude se mnou těžké pořízení, protože se usilovně snažím vyhýbat se programátorské angločeštině. Považuji to za část osvěty používat svůj rodný jazyk.

Nicméně, většinu pojmů jsem nepřekládal já, ale použil jsem české výrazy z akademického prostředí, které jsem našel na netu, takže by mělo jít (alespoň doufám) o korektní překlady. Já osobně bych nikdy nepřeložil closures jako uzávěry, ale zřejmě jde o uznávaný překlad. Takže z mojí strany nejde o lidovou tvořivost. Ale i tak je to někdy na facku :)

Pokud byste znali správnější či užívanější termín technicus, klidně mne opravte.

Haskell je sice FP jazyk, ale na druhou stranu vysvětlovat Haskellistům, co je to funkcionální programování bych považoval ze své strany za drzost. :) Mlčky doufám, že vysvětlení v obecně známějším jazyce je vhodnější a přístupnější.

Co se týče příkladů, jde mi spíš o filosofii FP než další návod, jak naprogramovat bojovníka v aréně funkcionálně :)

Budu jen rád za další připomínky. Když vás něco napadne, klidně to hoďte do issue. Na pythoní switch jsem pravděpodobně buď zapomněl anebo jsem tím nechtěl komplikovat zápis funkce.

Ale samozřejmě souhlasím, že v oblasti ADT nebo pattern matchingu (kristepane, jak je to česky!) Python zrovna neexceluje. Ale aspoň se konečně objevily enumerátory, když už nic.

Všiml jsem si totiž, že elegantní řešení nováčky nebo ty, co programují v jiném jazyce, spolehlivě matou. Proto úmyslně používám triviální příklady - a i tak si nejsem jistý, na kolik budou pro všechny srozumitelné.

Ještě jednou díky.

horejsek commented 7 years ago

Myslím, že použité české názvy jsou v pohodě. Spíš obecně nemám rád překládání, neb pak je těžší přejít do anglického (či českého) textu. Aspoň pro mne. :-)

K tomu Haskellu – nemyslel jsem to tak, aby se FP vysvětlovalo Haskellistům, ale tak, že z osobní zkušenosti mi nepřijde těžké jako nováček číst kód Haskellu a pochopit koncepty. Naopak to je po rychlém vysvětlení jednoduché, těžké mi přišlo začít přemýšlet funkcionálně, místo objektově, a správně to použít.

Každopádně je super, že se někdo snaží dělat osvětu. FP je skvělé a na některé typy úloh mnohem vhodnější, tudíž by nemělo chybět v dovednostech programátorů. Sám chci o FP psát, ale není čas. Snad se ti osvěta povede a nebudu tak často narážet na objekty, kde nemají co hledat. :-)

hanpari commented 7 years ago

Ahoj, ad Haskell - jo, já to pochopil, ale vzhledem k tomu, jaký minimální ohlas má FP v naších krajích, kde se kombinace PHP a OOP považuje za poslední technologický výkřik, bych neměl odvahu o Haskellu uvažovat, i kdybych ho uměl. Chvíli jsem koketoval s Fsharpem, ale Dotnetáři jsou zřejmě z povahy masochisti (čili nemají o IMHO lepší Fsharp zájem), navíc mi .NET nějak nesedí. Navíc Python umí sám o sobě pěkné věci, takže je to takové malé funkcionální dobrodružství.

Pokud bys chtěl jakkoliv přispět (nebo kdokoliv), není problém. Jak se ten notebook rozrůstá, začínám uvažovat, že bych časem použil vhodnější formu, buď v markdownu nebo rst, rozdělenou do kapitol. Takže by neměl být problém upravit nebo přidat nějaký kratší nebo delší text do repozitáře.

honzajavorek commented 7 years ago

BTW znáte http://www.meetup.com/Lambda-Meetup-Group/ ? Ti, přijde mi, se snaží FP u nás docela propagovat. Kdyby byl zájem, tak bychom s nimi mohli třeba udělat nějaký jeden společný sraz...? Ale to už by bylo asi na separátní issue. Jen mě to tak napadlo.

2016-08-24 12:48 GMT+02:00 hanpari notifications@github.com:

Ahoj, ad Haskell - jo, já to pochopil, ale vzhledem k tomu, jaký minimální ohlas má FP v naších krajích, kde se kombinace PHP a OOP považuje za poslední technologický výkřik, bych neměl odvahu o Haskellu uvažovat, i kdybych ho uměl. Chvíli jsem koketoval s Fsharpem, ale Dotnetáři jsou zřejmě z povahy masochisti (čili nemají o IMHO lepší Fsharp zájem), navíc mi .NET nějak nesedí. Navíc Python umí sám o sobě pěkné věci, takže je to takové malé funkcionální dobrodružství.

Pokud bys chtěl jakkoliv přispět (nebo kdokoliv), není problém. Jak se ten notebook rozrůstá, začínám uvažovat, že bych časem použil vhodnější formu, buď v markdownu nebo rst, rozdělenou do kapitol. Takže by neměl být problém upravit nebo přidat nějaký kratší nebo delší text do repozitáře.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/pyvec/zapojse/issues/38#issuecomment-242024569, or mute the thread https://github.com/notifications/unsubscribe-auth/AARTMVsMG6PK3XN_BR2gDRX4YAKesd8jks5qjCGDgaJpZM4JpKAa .

honzajavorek commented 7 years ago

Co se týče formy, tak ideálně to dotlačit do takové formy, která by šla jednou publikovat na připravovaném http://naucse.python.cz/, a to tuším bude Sphinx + rst, ale třeba mě @encukou opraví.

2016-08-24 13:48 GMT+02:00 Honza Javorek mail@honzajavorek.cz:

BTW znáte http://www.meetup.com/Lambda-Meetup-Group/ ? Ti, přijde mi, se snaží FP u nás docela propagovat. Kdyby byl zájem, tak bychom s nimi mohli třeba udělat nějaký jeden společný sraz...? Ale to už by bylo asi na separátní issue. Jen mě to tak napadlo.

2016-08-24 12:48 GMT+02:00 hanpari notifications@github.com:

Ahoj, ad Haskell - jo, já to pochopil, ale vzhledem k tomu, jaký minimální ohlas má FP v naších krajích, kde se kombinace PHP a OOP považuje za poslední technologický výkřik, bych neměl odvahu o Haskellu uvažovat, i kdybych ho uměl. Chvíli jsem koketoval s Fsharpem, ale Dotnetáři jsou zřejmě z povahy masochisti (čili nemají o IMHO lepší Fsharp zájem), navíc mi .NET nějak nesedí. Navíc Python umí sám o sobě pěkné věci, takže je to takové malé funkcionální dobrodružství.

Pokud bys chtěl jakkoliv přispět (nebo kdokoliv), není problém. Jak se ten notebook rozrůstá, začínám uvažovat, že bych časem použil vhodnější formu, buď v markdownu nebo rst, rozdělenou do kapitol. Takže by neměl být problém upravit nebo přidat nějaký kratší nebo delší text do repozitáře.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/pyvec/zapojse/issues/38#issuecomment-242024569, or mute the thread https://github.com/notifications/unsubscribe-auth/AARTMVsMG6PK3XN_BR2gDRX4YAKesd8jks5qjCGDgaJpZM4JpKAa .

hanpari commented 7 years ago

Jo, rst a Sphinx mi přijde jako dobrý nápad. Jinak díky za odkaz, neznal jsem.

encukou commented 7 years ago

naucse bude nakonec v HTML. ReST nebo Jupyter Notebook tam půjdou dát taky.

hanpari commented 7 years ago

Děkuji všem za podněty. Budu v práci pokračovat :)

Vytvořil jsem repozitář tady: https://github.com/hanpari/python_funkcionalne

Tohle issue uzavírám a rád bych poprosil všechny, aby případné náměty, připomínky směřovali tam.

Ještě jednou díky.

kvbik commented 7 years ago

jak psal @honzajavorek o skupine venujici se funkcionalnimu programovani, organizuje to @danskarda - myslim, ze by bylo dobre s nimi spojit sily.

priznavam se, ze jsem na text zatim moc nekoukal, ale rozhodne souhlasim s ujasnenim si ciloveho publika. plus prvni veta "Přiznejme si, že funkcionální programování je svinstvo" me mozna trosku zaskocila ;)).

hanpari commented 7 years ago

:) Nu, pokud jsem doufal, že silné prohlášení na úvod donutí čtenáře pokračovat - tak zde jsem selhal :)

Myslím, že jsem nechtěl začínat jako každá druhá funkcionální propaganda. Jak je FP skvělé a kdesi cosi... Všiml jsem si, že to stejně nezabírá. :)

Jinak samozřejmě díky za čas. Doufám, že ten šok rozdýcháš :)

Co se týče té skupiny - všiml jsem si, že k ní patří i K. Čížek. (Mimochodem, doporučuji jeho blog funkcionalne.cz). Netroufám si posoudit, do jaké míry by pro ně mohl být zajímavý projekt o pythoním FP, když jejich hlavní doménou, alespoň co jsem si všiml, jsou Scala a Clojure.

Oprava Clojure · Erlang Programming · Haskell · OCaml Programming · Scala · Lisp & Scheme · JVM Languages · F# Programming

Hm, Python chybí.

honzajavorek commented 7 years ago

Hm, Python chybí.

To zní jako výzva pro tebe ;)