it-swarm-eu.dev

Schéma vs Haskell pro úvod do funkčního programování?

Jsem pohodlný s programováním v C a C # a prozkoumám C++ v budoucnu. Možná mě bude zajímat zkoumání funkčního programování jako jiného programového paradigmatu. Dělám to pro zábavu, moje práce nezahrnuje počítačové programování a jsem poněkud inspirován používáním funkčního programování, vyučovaného poměrně brzy, v kurzech informatiky na vysoké škole. Lambda počet je jistě mimo mé matematické schopnosti, ale myslím, že zvládnu funkční programování.

Který z Haskell nebo Scheme poslouží jako dobrý úvod do funkčního programování? Jako textový editor používám emacs a rád bych jej v budoucnu snadněji nakonfiguroval, což by znamenalo naučit se Emacs LISP. Pochopil jsem však, že Emacs LISP se od schématu značně liší a je také procedurálnější než funkční.

Pravděpodobně budu používat knihu „Malý Schemer“, kterou jsem si již koupil, pokud budu sledovat program (zdá se mi trochu divný z mého omezeného listování skrz něj). Nebo bych použil „Nauč se Haskell pro velké dobro“, pokud budu sledovat Haskella. Na kanálu 9 bych také sledoval videa Intro to Haskell od dr. Erika Meijera.

Jakékoli návrhy, zpětná vazba nebo vstup jsou vítány.

Dík.

P.S. BTW Mám také přístup k F #, protože mám Visual Studio 2010, které používám pro vývoj C #, ale nemyslím si, že by to mělo být moje hlavní kritérium pro výběr jazyka.

36
haziz

Doporučil bych OCaml.

Podle mého osobního pohledu jsou hlavní základy moderních funkčních programování funkce vyšších řádů, statický typ systému a algebraické datové typy a párování vzorů.

Mezi schématem, ML a Haskellem bych si vybral ML, protože si myslím, že je pro tuto definici nejrelevantnější. Schéma nemá statické psaní (existuje Typed Racket, ale není to pro začátečníky schématu) a Haskell má příliš mnoho dalších věcí (monad, líné hodnocení ...), které, i když jsou zajímavé, mohou odvrátit pozornost od důležitého základu .

SML a OCaml jsou stejně zajímavé; Jsem na OCaml zvyklejší a má „praktičtější“ pocit, který je pěkný (ale pokud opravdu chcete „praktický“ k riziku ztráty duše, můžete si také vybrat F #).

Scheme a Haskell jsou také velmi zajímavé jazyky. Důraz na schémata na makra je zajímavý, ale nesouvisí přímo s funkčním programováním (je to další věc na světě, kterou byste si určitě měli vyzkoušet, stejně jako logické programování, jazyky založené na zásobníku a E-orientované na schopnosti).

Haskell je určitě skvělý jazyk a myslím si, že je to povinný bod pro aspirující guru funkčního programování. Ale protože základní jazyky OCaml a Haskell jsou velmi podobné (s výjimkou líného hodnocení, které je pro začátečníka rušivé), je snadné se naučit Haskell, jakmile znáte základy OCaml. Nebo se spíše můžete soustředit na podivné věci a nemusíte asimilovat základy současně.

Podobně, jakmile uvidíte OCaml a možná i Haskell, a přesto se chcete dozvědět více, měli byste se podívat na Coq nebo Agdu. Jen málokdo by doporučil Coq nebo Agda pro první úvod do funkčního programování ...

Abych to ujasnil: Myslím, že učení OCaml (nebo SML) pak Haskell z vás učiní tak dobrého funkčního programátora, jako je učení Haskell přímo, ale snadněji (nebo méně bolestivě).
Kromě toho OCaml a Haskell mají dobré věci, které je odlišují, a je zajímavé vědět o pokročilých funkcích obou . Pouhé učení se Haskellovi je v tomto ohledu chudší (i když se samozřejmě můžete naučit OCaml po Haskellovi; myslím si, že je to méně logické a bude vás frustrovanější).

Pro výuku OCamlu bych doporučil návrh knihy Jasona Hickeye (PDF) .

¹tato definice je kontroverzní. Někteří lidé Scheme tvrdí, že statické psaní nemá nic společného s funkčním programováním. Někteří lidé Haskellu budou tvrdit, že jejich definice čistoty („co Haskell dělá, ale nic víc“) je podmínkou sine qua non , že je funkčním jazykem . Souhlasím, že nesouhlasím.

28
gasche

Pokud vás zajímají pokročilejší koncepty funkčního programování, jděte na Haskella. Existuje správný typ systému a přísný zákaz mutace. Přesto, Haskell není pro slabé srdce.

Pokud chcete pouze představit funkční design, jděte na Scheme. Syntaxe se mnohem snáze učí a čte. Umožní procedurální programování, ale jen se disciplinujte, abyste nepoužili žádný postup s ! na konec jména.

Pomocí schématu si také můžete přečíst Struktura a interpretace počítačových programů , což je nejlepší úvod do programovacích paradigmat, ruce dolů. V knize jsou přednášky od MIT a Berkeley .

26
Hoa Long Tam

Správná odpověď je samozřejmě obojí! Jedná se tedy pouze o otázku, který jazyk je třeba řešit jako první. Moje situace je totožná s vaší. Malého Schemera jsem si opravdu užil. Určitě pochopíte základní konstrukty funkčního programování poté, co si to projdete (a budete mít místo, kam umístit želé skvrny!)

Jsem asi čtvrtina, abych se naučil Haskellově skvěle. Trochu si také užívám, ale obě knihy se nemohly lišit. Learn You Haskell má velmi tradiční přístup k výuce konkrétního jazyka. Malý Schemer je zjevně specifický pro Scheme, ale mnohem více se zabývá výukou základů funkčního programování, nikoli jazykem Scheme.

Rozhodně doporučuji začít s Malým Schemerem. Je to méně praktické, ale zásadnější.

17
DaveGauer

Mým dvěma centy, pokud jde o funkční programování, není zavěsit konkrétní jazyk, ale naučit se klíčové pojmy funkčního programování. Funkční programování jsem se naučil tím, že jsem hodil hlavu do projektu, ve kterém můj šéf trval na tom, aby se veškerý vývoj provedl v APL. APL je funkční jazyk pro zpracování pole a je tak daleko od LISP, Haskell nebo jakéhokoli jiného hlavního programovacího jazyka, jak můžete získat. Skutečná návratnost byla, když jsem zjistil, že jakmile jsem „propadl“ funkční programovací paradigma a mentálně jsem se naučil, jak auto-magicky rozložit problém na funkční program, už mě už nezdivily idiomatické aspekty jiných funkčních jazyků, jako je Haskell, OCaml, Scheme, Scala a Clojure. Od té doby jsem měl docela dost úspěchů v tom, že jsem se dostal do rychlosti s jinými funkčními jazyky a napsal jsem docela dobrý kód komerční kvality v OCaml, Scala a SBCL.

Kdybych měl zvolit první funkční jazyk, pravděpodobně bych si vybral Haskell nebo Steel Bank Common LISP (SBCL). Pro Haskella bych četl Nauč se Haskell ..., Skutečný svět Haskell, Cesta Haskell k logice, matematice a programování, a Perly funkčního algoritm. Pro CL bych četl Land of LISP, Paradigms of Artificial Intelligence Programming, a (pokud jste opravdu hardcore) Let over Lambda . Všechny tyto knihy můžete smíchat a porovnat, abyste získali široký přehled praktických přístupů a konceptů funkčního programování.

Také bych uvažoval o učení Clojure a Scaly, protože jsou to velmi dobré a velmi expresivní funkční jazyky samy o sobě (navzdory tomu, co FP purista by mohl říci).

17
Marc

Souhlasím s bodem „naučit se oba“, ale je tu ještě několik bodů, které dosud nebyly zmíněny. Nejprve, pokud jste ve funkčním programování nováčkem a chodíte s Haskellem, musíte kromě FP čelit několika novým věcem: musíte se naučit žít v líném prostředí, které může vyžadovat značné úsilí, a potřebujete vypořádat se se „skutečným“ systémem typu, který může být velmi vzdálený od toho, co používáte v C nebo C #.

Schéma, OTOH, má cizojazyčnou syntaxi, ale neexistuje žádný systém, který by se učil, a je to přísný jazyk, takže věci jsou známější. Implementace schématu jsou navíc velmi temperamentní - například Racket to přenese do extrému a poskytuje línou variantu a staticky typovou variantu. To znamená, že můžete začít s „jednoduchými“ věcmi a dostat se na hranu používání funkčního jazyka, a později se můžete sami rozvíjet a používat typovanou a línou variantu. Nyní by to mělo být jednodušší, protože se můžete vypořádat s jednou funkcí najednou. Jasně řečeno, koncepty budou natolik nové, že syntaktický problém bude menší a většinou irelevantní. Jinými slovy, jakmile se začnete zabývat novými koncepty, budete dostatečně zaneprázdněni, že syntaxe prostě zmizí. (A pokud vás opravdu zajímá syntaxe, pak Haskellova syntaxe je něco, co osobně považuji za velmi elegantní - ale to proto, že je také velmi daleko od průměrné syntaxe C/C #/C++.)

Ale poté, co jsem to všechno řekl, si myslím, že je tu také dobrý bod pro F # - říkáte, že to děláte jako vedlejší věc, ale když se naučíte FP, budete brzy chtít použít Všechny tyto dobré věci. Použití F # znamená, že můžete dělat více „skutečných“ věcí, protože je pravděpodobně snadné vyřešit stejný druh problémů, s nimiž se při své každodenní práci potýkáte. V ideálním případě se dostanete do bodu, kdy d vidět výhodu použití nad, řekněme, C # - a použít ji v nějakém projektu. Takže když máte pravdu, když nevyberete F # pouze proto, že je pro vás snadnější přístup, měli byste to zvážit, protože není nic lepšího, než ve skutečnosti pomocí těchto nových konceptů. Naopak, pokud používáte Scheme nebo Haskell a považujete to za jazyk hraček pro váš účel (i když víte, že někteří lidé používají to pro skutečné aplikace), pak nikdy nebudete brát celou věc FP příliš vážně. [Ale YMMV, je to většinou založeno na subjektivních pozorováních a může se lišit od jedné osoby k druhé.]

6
Eli Barzilay

Napište si schéma do 48 hodin (v haskell)

Opravdu to doporučuji. Haskell se naučíte pomocí skutečného a zajímavého problému a naučíte se nejlepší lekci schématu z hraní s tlumočníkem, který stavíte. Pokud se vydáte touto cestou, nechte si kolem sebe několik dobrých představení Haskell. Pokud budete mít problém vyřešit, budete jim lépe rozumět.

6
John F. Miller

Existuje nějaký důvod, proč ML není jednou z vašich možností? K dispozici je velké množství úvodních materiálů včetně knih a letáků. Pokud máte rádi The Little Schemer, můžete také využít The Little MLer. Nakonec můžete snadno provést přechod na F # později. (Ne že bych klepal na Haskell nebo Scheme - ideálně se učím všechny tři).

Také varovné slovo o Emacsu LISP. Nemyslím si, že vás na to připraví Haskell nebo ML. Pomáhá jazyk, jako je Schéma, ale stále existují velké rozdíly, např. dynamicky zaměřené proměnné. Rozšíření Emacsu jsou ze své podstaty obvykle imperativnější než funkční - jedná se pouze o změnu stavu editora.

6
petebu

Chtěl bych jít s Haskellem. Ve schématu můžete být nuceni dělat procedurální věci a jeho typový systém není zdaleka tak užitečný, má Haskell's, což je pro začátečníka skvělé, protože do značné míry kontroluje správnost kódu při kompilaci čas.

4
alternative

Myslím, že je snadné dohnat debaty o jazycích a zmeškat to. Pro někoho, kdo se chce jen dozvědět, o čem FP), rozdíly mezi Ocaml/ML/Scheme/Haskell nejsou tak důležité jako vaše pohodlí s materiálem (knihy, videa, nástroje) používáte to, abyste se to naučili. A zda máte přítele, který vám pomůže naučit se určitým jazykům, trumfne všechno ostatní.

1
autodidakto

V jedné z odpovědí, které jste obdrželi na svou otázku, jsem našel tento odkaz docela zajímavé, protože vám dává chuť Haskell a Scheme.

Kromě toho šikovného odkazu je zde i můj názor na vaši otázku.

Pokud přicházíte z nezbytného programovacího prostředí, můžete ukončit mnoho úsilí při učení funkčního programování. Zajistil bych, aby zkušenost s učením nebyla prázdná. To znamená, že jej můžete použít na svou současnou nebo příští práci nebo že vám to pomůže jiným způsobem.

Existuje spousta dobrých jazyků. Scala lidé by vychvalovali svůj jazyk, stejně jako lidé z Clojure a CL. Dokonce i Pythonistové si nárokují lenost. Ostatní lidé, kteří vám odpověděli, navrhli ML. Amit Rathore , kteří napsali Clojure v akci může dokonce navrhnout, abyste se naučili Haskell.

Zmínili jste Windows a F #. Pomůže vám to ve vaší současné pozici? Nevím nic o F #. Je to dostatečně funkční? Žádám o to, protože IMHO Python má funkční konstrukty, ale není to jako programování v Clojure).

Abychom to shrnuli, naučte se funkční jazyk, který je „skutečně“ funkční, a přitom dává nejlepší smysl pro vaši situaci.

0
octopusgrabbus

Pokud to není čisté, můžete také použít imperativní jazyk, tak Haskell.

0
pyon