Proč není Scheme čistě funkcionální jazyk?

ls

Proč není Scheme čistě funkcionální jazyk?
« kdy: 04. 09. 2012, 16:44:29 »
Proč nepatří LISP a Scheme do čistě funkcionálních jazyků?
« Poslední změna: 04. 09. 2012, 22:09:16 od Petr Krčmář »


Re:Scheme
« Odpověď #1 kdy: 04. 09. 2012, 17:00:28 »
Ne. Lisp patří do nečitelných jazyků a Scheme do projektů, které změnily jméno, aby nepůsobily tak odpudivě (viz Šachta & partners -> MSB Legal :)

P.S. co je to "čistě funkcionální jazyk"?

ls

Re:Scheme
« Odpověď #2 kdy: 04. 09. 2012, 17:11:07 »
To se snažím zjistit. Funkci z pohledu matematiky chápu, pochopím že přijímá paramatry a že jí (protože vraci hodnotu) můžu použít jako parametr jiné funkce. Ještě pochopím co je to side-effect, ale nevím čím si Hakell vysloužil to že je čistě funkcionální.

Radek Miček

Re:Scheme
« Odpověď #3 kdy: 04. 09. 2012, 17:17:05 »
Výsledkem vyhodnocení výrazu je hodnota. V některých jazycích však může při vyhodnocování výrazu dojít i k provedení nějaké akce - říkáme jí vedlejší efekt. Jazykům, které nemají vedlejší efekty, říkáme čisté. V čistých jazycích můžeme výraz nahradit jeho hodnotou, aniž by se změnilo chování programu (říká se tomu referenční transparentnost).

ls

Re:Scheme
« Odpověď #4 kdy: 04. 09. 2012, 17:28:11 »
Můžete mi uvést příklad nejaké funkce ve Scheme se side-effectem  co by v čistém jazyce nešlo, nešlo realizovat?
Pokud bych v C programoval tak, že si napíšu knihovnu funkcí, které pak v programu jen volám a předávám jim hodnoty, jde o funkcionální programování?


Re:Scheme
« Odpověď #5 kdy: 04. 09. 2012, 17:41:37 »
ale nevím čím si Hakell vysloužil to že je čistě funkcionální.

Citace
Haskell can’t have side effects because the laziness ensures that you don’t know what’s happening or when. That’s a great thing! Wonderful! There’s no reason to get bogged down in those sorts of low-level details unless you absolutely need to.

http://www.haskell.org/haskellwiki/Haskell_IO_for_Imperative_Programmers

Radek Miček

Re:Scheme
« Odpověď #6 kdy: 04. 09. 2012, 17:42:28 »
Citace
Můžete mi uvést příklad nejaké funkce ve Scheme se side-effectem  co by v čistém jazyce nešlo, nešlo realizovat?

Třeba set! nebo display. Když v programu o jednom výrazu (display "Ahoj") nahradím onen výraz jeho hodnotou, tak změním chování programu. V Haskellu však výraz putStrLn "Ahoj" nejde nahradit jeho hodnotou, protože tu hodnotu nejde zkonstruovat.

Re:Scheme
« Odpověď #7 kdy: 04. 09. 2012, 17:43:35 »
Můžete mi uvést příklad nejaké funkce ve Scheme se side-effectem  co by v čistém jazyce nešlo, nešlo realizovat?
http://lmgtfy.com/?q=scheme+side+effect ->
http://www.cs.washington.edu/education/courses/cse341/05au/lectures/scheme-side-effects.html

ls

Re:Scheme
« Odpověď #8 kdy: 04. 09. 2012, 17:46:30 »
A je nějaký důvod proč se vyplatí aby třeba jazyk nebyl čistě funkcionální, pokud tedy ztratí tu bezpečnost Haskellu.

PJ

Re:Scheme
« Odpověď #9 kdy: 04. 09. 2012, 17:57:23 »
Můžete mi uvést příklad nejaké funkce ve Scheme se side-effectem  co by v čistém jazyce nešlo, nešlo realizovat?
Nie je to, ze by to neslo, ale "cisty" jazyk to ma oddelene - ako napr. Haskell do monad.
Priklad takej operacie je citanie zo vstupu alebo zapis na vystup.

Pokud bych v C programoval tak, že si napíšu knihovnu funkcí, které pak v programu jen volám a předávám jim hodnoty, jde o funkcionální programování?
Funkcionalne je podla mna hlavne o tom, ze raz napisem a pouzivam stale. Okrem toho je "zvyk" vo funkcionalnych jazykoch nepouzivat napriklad cykly, aj ked cyklus ide implementovat aj vo funkcionalnom jazyku, ale su na to jednoducho lepsie nastroje.

Dovody pre mensiu bezpecnost je napriklad jednoduchsi zapis a jednoduchsie pochopenie zaciatocnikov.

Z mojho pohladu je C odlisne hlavne tym, ako v tom ludia pisu a na co je to primarne postavene. Nikto nikomu nebrani programovat v C objektovo alebo funkcionalne. Objektove programovanie by vyzadovalo vela robenia s pointermi, co sa urcite nikomu nechce, ked su jazyky, co to obstaraju "same".
Funkcionalne programovanie v C by vyzadovalo napriklad specialny typ zakladnych struktur ako su polia uz len kvoli dlzke (=nezdielatelny kod s kamosmi atd) a tiez vela predavani pointerov do funkcii. Cast by automaticky riesili templates ako v C++, cast dalsich problemov s uvolnovanim pamati by mozno riesil shared_ptr z C++, ale toto vsetko ide robit aj mechanicky. Najhorsie na tom je, ze keby to clovek robil rucne, tak by sa z toho asi zblaznil alebo by to padalo kvoli chybam, ktore vo funkcionalnych jazykoch ani nemozu nastat. V principe by to ale asi islo.


Radek Miček

Re:Scheme
« Odpověď #10 kdy: 04. 09. 2012, 18:20:16 »
Citace
A je nějaký důvod proč se vyplatí aby třeba jazyk nebyl čistě funkcionální, pokud tedy ztratí tu bezpečnost Haskellu.

Například nevýhoda řešení pomocí stavových monád (používá jej Haskell) je, že monády zhoršují znovupoužitelnost kódu a stavové monády jsou antiparalelní.

Nějaké důvody popsal Ben Lippmeier ve své disertační práci Type Inference and Optimisation for an Impure World v kapitole Introduction, podkapitole Why destructive update matters.

Radek Miček

Re:Scheme
« Odpověď #11 kdy: 04. 09. 2012, 18:28:41 »
Na druhou stranu na některé problémy popsané v té disertační práci existují určitá řešení - třeba Twan van Laarhovenovy čočky pro modifikaci vnořených struktur.

ls

Re:Scheme
« Odpověď #12 kdy: 04. 09. 2012, 19:51:56 »
Děkuji, to je vše zajímavé. Ještě by mě zajímalo, který funkcionální jazyk byste doporučili, kromě Scheme nebo Lispu.
Haskell, Erlang, Caml (Ocaml), v každém sem si zkusil pár věcí, ale zajíma mě pohled někoho kdo je umí porovnat. Třeba i jen podle sympatií.

Re:Scheme
« Odpověď #13 kdy: 04. 09. 2012, 20:21:39 »
Děkuji, to je vše zajímavé. Ještě by mě zajímalo, který funkcionální jazyk byste doporučili, kromě Scheme nebo Lispu.
Haskell, Erlang, Caml (Ocaml), v každém sem si zkusil pár věcí, ale zajíma mě pohled někoho kdo je umí porovnat. Třeba i jen podle sympatií.
Můžu fakt jenom podle sympatií - s Haskellem jsme dělali něco málo jenom na škole a to byly úplný základy, s OCamlem jsem nedělal nikdy vůbec a Lispu jsem se vždycky záměrně vyhýbal jako čert kříži, protože prostě mám iracionální averzi k někomu, kdo je schopen rozvíjet jazyk bez syntaxe ;)

Jednoznačně bych doporučil Erlang, hlavně proto, že to není žádná akademická blbůstka, ale jazyk navržený primárně pro průmyslové využítí - a přesto navržený opravdu dobře a čistě. Moc jsem si ho oblíbil - prvotní setkání je trochu WTF?, ale jak člověk pochopí logiku návrhu a tu robustnost založenou na jednoduchosti, tak si ho prostě imho nemůže nezamilovat :)
Jasně, různé opruzy má taky, dokonalého na světě není nic.

Ještě se mi hodně líbil Prolog, ale tam je to už o dost horší s praktickou využitelností. Není to moc (rozumně) univerzálně použitelný jazyk.

Re:Scheme
« Odpověď #14 kdy: 04. 09. 2012, 20:25:35 »
Abych Erlang jenom nechválil, zepár těch hlavních opruzů je pěkně popsaných třeba tady: http://damienkatz.net/2008/03/what_sucks_abou.html