Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ls 04. 09. 2012, 16:44:29

Název: Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: ls 04. 09. 2012, 16:44:29
Proč nepatří LISP a Scheme do čistě funkcionálních jazyků?
Název: Re:Scheme
Přispěvatel: Mirek Prýmek 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"?
Název: Re:Scheme
Přispěvatel: ls 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í.
Název: Re:Scheme
Přispěvatel: Radek Miček 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).
Název: Re:Scheme
Přispěvatel: ls 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í?
Název: Re:Scheme
Přispěvatel: Mirek Prýmek 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
Název: Re:Scheme
Přispěvatel: Radek Miček 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.
Název: Re:Scheme
Přispěvatel: Mirek Prýmek 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
Název: Re:Scheme
Přispěvatel: ls 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.
Název: Re:Scheme
Přispěvatel: PJ 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.

Název: Re:Scheme
Přispěvatel: Radek Miček 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 (http://www.cse.unsw.edu.au/~benl/papers/thesis/lippmeier-impure-world.pdf) v kapitole Introduction, podkapitole Why destructive update matters.
Název: Re:Scheme
Přispěvatel: Radek Miček 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 (http://twanvl.nl/files/lenses-talk-2011-05-17.pdf) pro modifikaci vnořených struktur.
Název: Re:Scheme
Přispěvatel: ls 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í.
Název: Re:Scheme
Přispěvatel: Mirek Prýmek 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.
Název: Re:Scheme
Přispěvatel: Mirek Prýmek 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
Název: Re:Scheme
Přispěvatel: Radek Miček 04. 09. 2012, 21:04:11
Volil bych staticky typovaný jazyk, neboť dobře využitý silný typový systém může odhalit mnoho chyb ještě před spuštěním programu. Myslím, že OCaml našel docela dobrý kompromis mezi statickou bezpečností a jednoduchostí, proto bych doporučil OCaml.

Nicméně i OCaml má určitá omezení, hlavním z nich je nepodpora paralelního a distribuovaného programování. To se pak řeší buďto knihovnami - např. součástí knihovny ocamlnet (http://projects.camlcity.org/projects/ocamlnet.html) je netmulticore - nebo upraveným jazykem JoCaml (http://jocaml.inria.fr/), který implementuje join-calculus (http://en.wikipedia.org/wiki/Join-calculus) - formalismus pro distribuované programování. Na druhou stranu Haskell je v tomto ohledu mnohem dál: Parallel and Concurrent Programming in Haskell (http://community.haskell.org/~simonmar/par-tutorial.pdf), GPGPU programming with Accelerate (http://community.haskell.org/~simonmar/slides/cadarache2012/7%20-%20accelerate.pdf).
Název: Re:Scheme
Přispěvatel: Mirek Prýmek 04. 09. 2012, 21:11:25
hlavním z nich je nepodpora paralelního a distribuovaného programování.
To jsem nevěděl, díky! To je teda v dnešní době docela velká nevýhoda...
Název: Re:Scheme
Přispěvatel: Radek Miček 04. 09. 2012, 21:40:01
Citace
To je teda v dnešní době docela velká nevýhoda...

Pro některé aplikace ano. Na druhou stranu i přesto v OCamlu vznikl projekt Plasma (http://plasma.camlcity.org/plasma/index.html) (distribuovaný souborový systém, map/reduce systém a databáze).

Doménou OCamlu je symbolický výpočet tj. dokazovače jako Coq (http://coq.inria.fr/), nástroje pro analýzu kódu jako Frama-C (http://frama-c.com/) nebo pfff (https://github.com/facebook/pfff/) a kompilátory. OCaml rozhodně není jazyk pro numerické výpočty.
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: Logik 05. 09. 2012, 13:48:03
A co Clojure, když už tu vyjmenováváme ZOO?
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: ezdiy 08. 09. 2012, 20:13:26
Z non-pure funkctionalnich jazyku co se masove pouzivaji je treba zminit jazyk Lua. Semanticky je 1:1 se Scheme, minus continuations, coroutina nekopiruje stav threadu (kazdy stav lze "zavolat" jen jednou).

Jedine co stacilo k uspechu je rozumna syntax (i kdyz takrka absolutni absence syntactic sugar zrovna v tomto pripade jest obeti bohum Minimalismu zbytecne velkou).

Pure haskell je z matematickeho pohledu moc fajn, ale z nejakeho duvodu pouzivaji vsichni OCaml. Procpak asi? :)
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: Inkvizitor 09. 09. 2012, 07:30:57
Pure haskell je z matematickeho pohledu moc fajn, ale z nejakeho duvodu pouzivaji vsichni OCaml. Procpak asi? :)

Kteri vsichni?
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: blizzz 09. 09. 2012, 09:19:21
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í.

Ja by som ti doporucil F#. Je to take menej ukecane Ocaml, neni to ziadna hracka pre teoretikov, ale realne pouzivany jazyk, podporovany vo Visual Studiu ja v tom pisem skoro vsetko dokonca uz aj Webovky vo vlastnom frameworku.

neviem aka je situacia na trhu prace, ale niekto mi hovoril ze v F# sa teraz vo velkom kodia softy na automatizovany mass trading (akcie, komodity, forex) a ze takyto vyvojari zarabaju 300 - 700 tisic USD rocne.
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: KapitánRUM 09. 09. 2012, 22:05:00
To F# vypadá vážně nadějně a zajímavě!
Sleduju ho už nějakou dobu (dělám v C#) a platy jsou zatraceně velký k vůli mega projektům, který se na tom začínají dělat!
Nejmenovaná CZ společnost se zahraničním vlastníkem na tom chce postavit nový finanční výpočetní systém pro půjčky a padaly tu částky jako 80 pro obyč programátora a 120 tisíc pro vedoucího, kdy se zdá, že ani vyšší cena za člověkohodinu není na překážku.
Mě se to netýká, já se programováním živit nemůžu, ale nemůžu říct, že by se mi nelíbilo přemýšlet o platu 120 tisíc měsíčně.
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: KapitánRUM 09. 09. 2012, 22:08:55
Jo a jednalo se o náboru cca 35-ti programátorů (3 týmy - interní software na vyhodnocování rizik, portál, aplikace pro jejich dealery).
Ostatně společnost, která na poskytování "LEVNÝCH PŮJČEK" vydělává tolik, že by v zimě mohli prachama topit, se netrápí s tím, jestli náklady budou trochu vyšší nebo nižší.
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: ls 10. 09. 2012, 15:35:17
Děkuji, ale Visual Stuio mi nic neříká, myslím že bez něj dožiju.
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: Radek Miček 10. 09. 2012, 16:57:50
Když už jsme u těch IDE, tak pro OCaml bych doporučil TypeRex (http://www.typerex.org/) nebo OcaIDE (http://www.algo-prog.info/ocaide/index.php).
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: lmb 10. 09. 2012, 19:37:54
Z non-pure funkctionalnich jazyku co se masove pouzivaji je treba zminit jazyk Lua. Semanticky je 1:1 se Scheme, minus continuations, coroutina nekopiruje stav threadu (kazdy stav lze "zavolat" jen jednou).

Jedine co stacilo k uspechu je rozumna syntax (i kdyz takrka absolutni absence syntactic sugar zrovna v tomto pripade jest obeti bohum Minimalismu zbytecne velkou).

Pure haskell je z matematickeho pohledu moc fajn, ale z nejakeho duvodu pouzivaji vsichni OCaml. Procpak asi? :)
1) Lua není funkcionální jazyk. Přítomnost pár paradigmat z f. jazyků ho z něj nedělá. Imperativní jazyk s funkcionálními prvky. Stejně jako populárnější Python nebo Ruby.

2) OCaml používanější než Haskell ? Asi žijeme každý na jiné planetě. Zkuste najít srovnatelnou databázi knihoven a aplikací jako je Hackage (http://hackage.haskell.org/packages/archive/pkg-list.html) pro OCaml a hlavně porovnejte jejich aktuálnost a dotaženost. Nebo programátorská fóra a počty příspěvků. Ani se nedivím, že OCaml má ještě menší popularitu. Méně elegantní a konzistentní syntaxe, kompromis v podobě ústupu od ztráty funkcionální čistoty.
Název: Re:Scheme
Přispěvatel: jarin 10. 09. 2012, 21:39:21
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.

Podle mě hlavní rozdíl je spíš teoretický. Imperativní program je posloupnost příkazů, které se postupně vykonávají a čistě funkcionální program je výraz (strom), který se redukuje. Redukce probíhá od listů ke kořenu, jinak nezáleží na pořadí (můžu program vyhodnocovat zprava doleva nebo napřeskáčku). "Funkcionální program" v C, tak z prinicpu má trochu jinou sémantiku. Jinak psát "funkcionální programy" v C není problém. Mohl bys používat pouze konstantní proměnné a funkce musí být plně definované svými parametry (když je zavoláš v libovolném místě programu se stejným parametrem, tak musí vrátit stejný výsledek). Ale jak jsem psal sémantika by pořád byla trochu jiná a navíc efektivita takového programu by asi nebyla úplně ideální.

Na druhou stranu se potom ale všechny programy vykonávají na fyzických strojích, které vlastně jenom vykonávají posloupnost příkazů, takže těžko hodnotit co je pořád ještě funkcionální jazyk.

Na druhou
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: Radek Miček 10. 09. 2012, 22:21:12
Citace
Zkuste najít srovnatelnou databázi knihoven a aplikací jako je Hackage pro OCaml a hlavně porovnejte jejich aktuálnost a dotaženost.

Co třeba The Caml Hump (http://caml.inria.fr/cgi-bin/hump.cgi)? Jako by na Hackage byly všechny knihovny dotažené.

Citace
Méně elegantní a konzistentní syntaxe

V čem je méně konzistentní?

Citace
kompromis v podobě ústupu od ztráty funkcionální čistoty.

Ten kompromis však obšas ušetří psaní. A i v některých knihovnách Haskellu se používá unsafePerformIO.
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: lmb 10. 09. 2012, 23:46:48
Citace
Zkuste najít srovnatelnou databázi knihoven a aplikací jako je Hackage pro OCaml a hlavně porovnejte jejich aktuálnost a dotaženost.

Citace
Co třeba The Caml Hump (http://caml.inria.fr/cgi-bin/hump.cgi)? Jako by na Hackage byly všechny knihovny dotažené.
O dost slabší co do rozsahu a posledních dat aktualizací, ne ? Nikde jsem nepsal, že knihovny v Hackage jsou všechny dotažené, ale pořád je větší výběr a větší aktivita kolem nich.

Citace
Méně elegantní a konzistentní syntaxe

Citace
V čem je méně konzistentní?
Je toho víc, ale alespoň částečně "řešené" (rozuměj odlišné od standardu) už x-tou verzí OCaml Revised syntax (http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html) a viz http://caml.inria.fr/pub/docs/tutorial-camlp4/tutorial005.html (http://caml.inria.fr/pub/docs/tutorial-camlp4/tutorial005.html). Pro Haskell nic takového není potřeba.
Citace
kompromis v podobě ústupu od ztráty funkcionální čistoty.

Citace
Ten kompromis však obšas ušetří psaní. A i v některých knihovnách Haskellu se používá unsafePerformIO.
"Ale vy zase mlátíte černochy..." unsafePerformIO Ano, některé z knihoven tento "hack" využívají z důvodů výkonostních nebo FFI komunikace, ale jinak je to velmi okrajová záležitost ke které není důvod se v 99% případů uchýlit a spíš to vyplývá ze špatného návrhu. Kdo ji používá např. k implementaci globálního stavu nebo třeba na memoizaci, tak je to jenom z neznalosti a znásilňování jazyka zvykama z jiných prostředí.

Teď jsem četl že ani poslední verze OCamlu (resp. GC a základní knihovny) stále neumí běh na více jádrech. To je docela tristní  :-\
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: Radek Miček 11. 09. 2012, 00:27:34
Citace
O dost slabší co do rozsahu a posledních dat aktualizací, ne?

Přijde mi celkem aktuální. Rozsah jsem nikdy nezkoumal, nicméně nemívám problém najít potřebné knihovny pro OCaml. Naopak měl jsem problém najít rozumnou (= názvy funkcí nemají deset kilometrů) GUI knihovnu pro Haskell.

Citace
Je toho víc, ale alespoň částečně "řešené" (rozuměj odlišné od standardu) už x-tou verzí OCaml Revised syntax

OCaml Revised syntax souvisí s nástrojem Camlp4 a IMO snahou je se jí zbavit, protože je hnusná, a nechat si originální syntax, která je IMO konzistentní. Pokud nepíšete syntaktická rozšíření pomocí Camlp4, tak žádnou revisited syntax nepotřebujete.

Citace
Kdo ji používá např. k implementaci globálního stavu nebo třeba na memoizaci, tak je to jenom z neznalosti a znásilňování jazyka zvykama z jiných prostředí.

Možná, nicméně pak se o předání stavu musí postarat konzument knihovny, což může být méně pohodlné, zejména pokud se ten stav vůbec nemění (pouze se nastaví při inicializaci).
Název: Re:Proč není Scheme čistě funkcionální jazyk?
Přispěvatel: Radek Miček 11. 09. 2012, 10:39:34
Citace
Naopak měl jsem problém najít rozumnou (= názvy funkcí nemají deset kilometrů) GUI knihovnu pro Haskell.

Všiml jsem si, že wxHaskell znovu ožila (v letech 2010 a 2011 to vypadalo, že je mrtvá).