Haskell
![]() |
|
| Êëàññ ÿçûêà: | |
|---|---|
| Òèï èñïîëíåíèÿ: | |
| Ïîÿâèëñÿ â: | |
| Òèïèçàöèÿ äàííûõ: | |
| Îñíîâíûå ðåàëèçàöèè: | |
| Äèàëåêòû: |
Helium, Gofer, O'Haskell, Haskell++, Mondrian, Disciple |
| Èñïûòàë âëèÿíèå: |
Lisp è Scheme, ISWIM, FP, ÀÏË, Hope è Hope+, SISAL, Miranda, ML è Standard ML, Lazy ML, Orwell, Id |
| Ïîâëèÿë íà: |
Agda, Bluespec, Clojure, C#, CAL, Cat, Cayenne, Clean, Curry, Epigram, Escher, F#, Factor, Isabelle, Java Generics, LINQ, Mercury, Omega, Perl 6, Python, Qi, Scala, Timber, Visual Basic 9.0 |
| Ñàéò: | |
Haskell (ðóñ. Õà́ñêåëü, Õà́ñêåëë) â ñòàíäàðòèçîâàííûé ÷èñòûé ôóíêöèîíàëüíûé ÿçûê ïðîãðàììèðîâàíèÿ îáùåãî íàçíà÷åíèÿ. ßâëÿåòñÿ îäíèì èç ñàìûõ ðàñïðîñòðàí¸ííûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ ñ ïîääåðæêîé îòëîæåííûõ âû÷èñëåíèé. Òèïèçàöèÿ â Õàñêåëå ñòðîãàÿ, ñòàòè÷åñêàÿ, ñ àâòîìàòè÷åñêèì âûâîäîì òèïîâ. Ïîñêîëüêó ÿçûê ôóíêöèîíàëüíûé, òî îñíîâíàÿ óïðàâëÿþùàÿ ñòðóêòóðà â ýòî ôóíêöèÿ. Ñåðü¸çíîå îòíîøåíèå ê òèïèçàöèè â åù¸ îäíà îòëè÷èòåëüíàÿ ÷åðòà Õàñêåëÿ. Êîíöåïöèÿ ÿçûêà îòðàæàåò èäåþ ìàòåìàòèêà Õàñêåëëà Êàððè, ïèñàâøåãî, ÷òî «äîêàçàòåëüñòâî â ýòî ïðîãðàììà, à äîêàçûâàåìàÿ ôîðìóëà â ýòî òèï ïðîãðàììû»[1][2]. Èìåííî â ÷åñòü Õ. Êàððè ÿçûê è ïîëó÷èë ñâî¸ íàçâàíèå.
Ñåãîäíÿ Õàñêåëü ñòàë ÿçûêîì áûñòðîé ðàçðàáîòêè íà䏿íûõ, êðàòêèõ è êîððåêòíûõ ïðîãðàìì. Èìåþòñÿ ñðåäñòâà âçàèìîäåéñòâèÿ ñ êîäîì íà äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ. Åñòü âñòðîåííàÿ ïîääåðæêà ìíîãîçàäà÷íîãî è ïàðàëëåëüíîãî ïðîãðàììèðîâàíèÿ, ðàçâèòûé èíñòðóìåíòàðèé (ñðåäñòâà àâòîìàòè÷åñêîãî òåñòèðîâàíèÿ, îòëàäêè è ïðîôèëèðîâàíèÿ, â òîì ÷èñëå äëÿ ïàðàëëåëüíûõ ïðîãðàìì), ñóùåñòâóåò ìíîãî áèáëèîòåê ñ îòêðûòûì èñõîäíûì êîäîì (áîëåå 1800 ïàêåòîâ â îäíîì òîëüêî àðõèâå Hackage)[3].
Ñîäåðæàíèå |
[ïðàâèòü] Èñòîðèÿ
Õàñêåëü ïðèíàäëåæèò ê ñåìåéñòâó ÿçûêîâ ML. Íåïîñðåäñòâåííî íà íåãî îêàçàë áîëüøîå âëèÿíèå ÿçûê Miranda, ðàçðàáîòàííûé â 1985 ã. Äýâèäîì Ò¸ðíåðîì. Ìèðàíäà áûëà ïåðâûì ÷èñòûì ôóíêöèîíàëüíûì ÿçûêîì, èìåâøèì êîììåð÷åñêóþ ïîääåðæêó, è áûëà îòíîñèòåëüíî ïîïóëÿðíà â 1980-õ ãîäàõ, íî îñòàâàëàñü íåñâîáîäíûì ïðîãðàììíûì îáåñïå÷åíèåì. Ýòî çàòðóäíÿëî ðàçâèòèå è èññëåäîâàíèÿ âîçìîæíîñòåé ëåíèâîãî ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ, ïîýòîìó áóêâàëüíî çà ïàðó ëåò ïîÿâèëîñü áîëåå äåñÿòêà ñõîæèõ ÿçûêîâ. ×òîáû îáúåäèíèòü óñèëèÿ ðàçíûõ ðàçðàáîò÷èêîâ, â 1987 ã. íà êîíôåðåíöèè ïî ôóíêöèîíàëüíûì ÿçûêàì ïðîãðàììèðîâàíèÿ è êîìïüþòåðíîé àðõèòåêòóðå â Îðåãîíå (FPCAâ™87) áûëî ðåøåíî ñîçäàòü êîìèòåò äëÿ ðàçðàáîòêè îòêðûòîãî ñòàíäàðòà.
 1990 ã. áûëà ïðåäëîæåíà ïåðâàÿ âåðñèÿ ÿçûêà, Haskell 1.0.  äàëüíåéøåì ðàáîòà êîìèòåòà ïðîäîëæèëàñü, è â 1999 ã. áûë îïóáëèêîâàí «The Haskell 98 Report[4]», êîòîðûé ñòàë ñòàáèëüíûì ñòàíäàðòîì ÿçûêà íà ìíîãî ëåò. ßçûê, îäíàêî, ïðîäîëæàë áóðíî ðàçâèâàòüñÿ, êîìïèëÿòîð GHC áûë ôàêòè÷åñêèì ñòàíäàðòîì â îòíîøåíèè íîâûõ âîçìîæíîñòåé.
Ñåé÷àñ ðàçðàáîòêà íîâûõ âåðñèé ÿçûêà èä¸ò îòêðûòî, ýòîò ïðîöåññ ïîëó÷èë íàçâàíèå Haskellâ™[5] (Haskell Prime [ˈhæskəl praɪm], «Õàñêåëü-øòðèõ»). Âñå æåëàþùèå ìîãóò âûäâèãàòü ñâîè ïðåäëîæåíèÿ ê îáñóæäåíèþ, ïðåäëîæåíèÿ îáñóæäàþòñÿ â òå÷åíèå ãîäà, êîìèòåò îòáèðàåò è îáúÿâëÿåò ïðåäëîæåíèÿ, êîòîðûå ãîòîâ ïðèíÿòü, ôîðìèðóåòñÿ íîâûé êîìèòåò è ê êîíöó ãîäà ãîòîâèòñÿ íîâàÿ âåðñèÿ ÿçûêà. Òàêèì îáðàçîì, íîâûå âåðñèè ÿçûêà òåïåðü ìîãóò ïîÿâëÿòüñÿ êàæäûé ãîä. Ïëàíèðóåòñÿ îáúÿâëÿòü íåêîòîðûå ðåâèçèè «çíà÷èòåëüíûìè» è ïîääåðæèâàòü òàêèå ðåâèçèè íà ïðîòÿæåíèè äëèòåëüíîãî âðåìåíè.
Ïîñëåäíÿÿ âåðñèÿ ÿçûêà â Haskell 2010 â áûëà îáúÿâëåíà â êîíöå 2009 ã[6], íî ïîñëåäíåé «çíà÷èòåëüíîé» âåðñèåé (ñòàíäàðòîì) îñòà¸òñÿ Haskell 98.
[ïðàâèòü] Õàðàêòåðèñòèêè ÿçûêà
 êà÷åñòâå îñíîâíûõ õàðàêòåðèñòèê ÿçûêà Haskell ìîæíî âûäåëèòü ñëåäóþùèå:
- âîçìîæíîñòü èñïîëüçîâàíèÿ ëÿìáäà-àáñòðàêöèè;
- ôóíêöèè âûñøåãî ïîðÿäêà;
- ÷àñòè÷íîå ïðèìåíåíèå;
- íåäîïóñòèìîñòü ïîáî÷íûõ ýôôåêòîâ (÷èñòîòà ÿçûêà);
- ëåíèâûå âû÷èñëåíèÿ (lazy evaluation);
- ñîïîñòàâëåíèå ñ îáðàçöîì, ôóíêöèîíàëüíûå îáðàçöû (pattern matching);
- ïàðàìåòðè÷åñêèé ïîëèìîðôèçì (â òîì ÷èñëå àáñòðàãèðîâàíèå îò êîíñòðóêòîðà òèïà) è ïîëèìîðôèçì êëàññîâ òèïîâ;
- ñòàòè÷åñêàÿ òèïèçàöèÿ;
- àâòîìàòè÷åñêîå âûâåäåíèå òèïîâ (îñíîâàíî íà ìîäåëè òèïèçàöèè Õèíäëè â Ìèëíåðà);
- àëãåáðàè÷åñêèå òèïû äàííûõ;
- ïàðàìåòðèçóåìûå òèïû äàííûõ;
- ðåêóðñèâíûå òèïû äàííûõ;
- àáñòðàêòíûå òèïû äàííûõ (èíêàïñóëÿöèÿ);
- ãåíåðàòîðû ñïèñêîâ (list comprehensions);
- îõðàíÿþùèå âûðàæåíèÿ (guards);
- âîçìîæíîñòü ïèñàòü ïðîãðàììû ñ ïîáî÷íûìè ýôôåêòàìè áåç íàðóøåíèÿ ïàðàäèãìû ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ ñ ïîìîùüþ ìîíàä;
- âîçìîæíîñòü èíòåãðàöèè ñ ïðîãðàììàìè, ðåàëèçîâàííûìè íà èìïåðàòèâíûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ïîñðåäñòâîì îòêðûòûõ èíòåðôåéñîâ (ñòàíäàðòíîå ðàñøèðåíèå ÿçûêà Foreign Function Interface (àíãë.)ðóññê.[7]).
Ñî âðåìåíè ïðèíÿòèÿ ïîñëåäíåãî ñòàíäàðòà ÿçûêà (Haskell98) ïðîøëî ìíîãî âðåìåíè, è ñ òåõ ïîð âåäóùèå ðåàëèçàöèè ÿçûêà (ghc è hugs) áûëè ðàñøèðåíû ìíîæåñòâîì äîïîëíèòåëüíûõ âîçìîæíîñòåé:
- Ïîëèìîðôèçì 2-ãî è âûñøèõ ðàíãîâ (rank-2 and rank-N polymorphism)
- Ôóíêöèîíàëüíûå çàâèñèìîñòè (FD, functional dependencies)
[ïðàâèòü] Ðåàëèçàöèè ÿçûêà
Åñòü íåñêîëüêî ðåàëèçàöèé ÿçûêà Õàñêåëü[8]. Íåêîòîðûå ðåàëèçàöèè îðèåíòèðîâàíû íà ïðàêòè÷åñêîå ïðèìåíåíèå, â òî âðåìÿ êàê äðóãèå â ïðåäñòàâëÿþò ïðåæäå âñåãî àêàäåìè÷åñêèé èíòåðåñ.
[ïðàâèòü] Êîìïèëÿòîðû è èíòåðïðåòàòîðû
Íàèáîëåå ïîïóëÿðåí íà ïðàêòèêå îïòèìèçèðóþùèé êîìïèëÿòîð GHC, êîòîðûé ñîçäà¸ò áûñòðûé êîä è ïîçâîëÿåò èñïîëüçîâàòü ìíîãèå ðàñøèðåíèÿ ÿçûêà. GHC ìîæåò îïòèìèçèðîâàòü êàê ñêîðîñòü, òàê è êîìïàêòíîñòü ïðîãðàìì, ñïîñîáåí ñîçäàâàòü ìíîãîçàäà÷íûé è ïàðàëëåëèçîâàííûé êîä.  êîìïëåêòå ñ êîìïèëÿòîðîì GHC ïîñòàâëÿåòñÿ òàêæå èíòåðàêòèâíàÿ ñðåäà ïðîãðàììèðîâàíèÿ GHCi ñî âñòðîåííûì îòëàä÷èêîì. GHC ðàáîòàåò â Windows, MacOS X è íà íåñêîëüêèõ þíèêñ-ïîäîáíûõ ïëàòôîðìàõ (Linux, *BSD, Solaris). Èìåííî GHC ÿâëÿåòñÿ ñòàíäàðòíûì êîìïèëÿòîðîì â Haskell Platform, è èìåííî íà í¸ì â ïåðâóþ î÷åðåäü òåñòèðóþòñÿ âñå íîâûå áèáëèîòåêè.
Äðóãàÿ ïîïóëÿðíàÿ ðåàëèçàöèÿ ÿçûêà â èíòåðïðåòàòîð HUGS. Îí íàïèñàí íà Ñè, èìååò ìàëûé ðàçìåð äèñòðèáóòèâà è ðàáîòàåò ïðàêòè÷åñêè íà âñåõ ïëàòôîðìàõ. HUGS ïðåäîñòàâëÿåò èíòåðàêòèâíóþ ñðåäó ïðîãðàììèðîâàíèÿ, íî ìîæåò òàêæå çàïóñêàòü ïðîãðàììû íà Õàñêåëå â ñòèëå ñêðèïòîâûõ ÿçûêîâ. Ïîëüçîâàòåëè Windows ìîãóò èñïîëüçîâàòü ãðàôè÷åñêóþ èíòåðàêòèâíóþ ñðåäó WinHugs. Ïîñêîëüêó HUGS èíòåðïðåòàòîð, òî ïðîãðàììû, çàïóùåííûå â í¸ì, âûïîëíÿþòñÿ ìåäëåííåå, ÷åì êîä, ñîçäàííûé áîëüøèíñòâîì êîìïèëÿòîðîâ Õàñêåëÿ. HUGS ÷àñòî ðåêîìåíäóþò â êà÷åñòâå ñðåäû äëÿ èçó÷åíèÿ ÿçûêà. HUGS ïîëíîñòüþ ïîääåðæèâàåò ñòàíäàðò ÿçûêà Haskell 98, à òàêæå íåêîòîðûå íàèáîëåå ïîïóëÿðíûå ðàñøèðåíèÿ ÿçûêà.
Äðóãèå èçâåñòíûå ðåàëèçàöèè:
- nhc98 â áûñòðûé êîìïèëÿòîð, ïîääåðæèâàþùèé ñòàíäàðò Haskell 98, íàïèñàííûé íà Haskell 98; äîñòóïåí äëÿ âñåõ þíèêñ-ïîäîáíûõ ïëàòôîðì, âêëþ÷àÿ MacOS X è Windows/cygwin
- YHC (York Haskell Compiler) â ôîðê nhc98, ñòàâÿùèé öåëüþ áûòü áîëåå ïåðåíîñèìûì è ýôôåêòèâíûì, ïîääåðæèâàåò îòëàä÷èê Hat; ãåíåðèðóåò ïðîìåæóòî÷íûé áàéò-êîä, êîòîðûé ìîæíî èñïîëüçîâàòü äëÿ ãåíåðàöèè êîäà íà äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ
- UHT (Utrecht Haskell Compiler) â êîìïèëÿòîð, ïîääåðæèâàþùèé Haskell 98 ïî÷òè ïîëíîñòüþ, à òàêæå íåêîòîðûå ðàñøèðåíèÿ; ïîääåðæèâàåò ãëîáàëüíûé àíàëèç ïðîãðàìì; èìååò íåñêîëüêî êîäîãåíåðàòîðîâ, â òîì ÷èñëå ïî÷òè ïîëíîñòüþ ôóíêöèîíàëüíûé ãåíåðàòîðì JVM-êîäà, êîäîãåíåðàòîðû äëÿ LLVM è CLR â ñîñòîÿíèè ðàçðàáîòêè; ðàáîòàåò íà þíèêñ-ïîäîáíûõ ñèñòåìàõ (âêëþ÷àÿ MacOS X è Windows/cygwin)
- HBI è HBC â èíòåðïðåòàòîð è êîìïèëÿòîð, ïîääåðæèâàþùèå ñòàíäàðò Haskell 98 ñ íåêîòîðûìè ðàñøèðåíèÿìè; òî÷íî ðàáîòàåò â Linux, ïîääåðæèâàåòñÿ ñëàáî
- LHC (The Luxurious LHC Haskell Optimization System) â àëüòåðíàòèâíûé êîäîãåíåðàòîð äëÿ GHC, ïîääåðæèâàþùèé ãëîáàëüíóþ íèçêîóðîâíåâóþ îïòèìèçàöèþ ïðîãðàììû â öåëîì
- jhc â ýêñïåðèìåíòàëüíûé êîìïèëÿòîð äëÿ èññëåäîâàíèÿ âîçìîæíîñòåé ãëîáàëüíîé îïòèìèçàöèè ïðîãðàìì
- Yale Haskell â ðàííÿÿ ðåàëèçàöèÿ ÿçûêà Õàñêåëü íà Lisp
[ïðàâèòü] Haskell Platform
 2009 ãîäó ñôîðìèðîâàëàñü êîíöåïöèÿ Haskell Platform[9] â ñòàíäàðòíîãî äèñòðèáóòèâà ÿçûêà, âêëþ÷àþùåãî êðîìå êîìïèëÿòîðà (GHC), òàêæå äîïîëíèòåëüíûé èíñòðóìåíòàðèé (ñèñòåìó ñáîðêè è ðàçâ¸ðòûâàíèÿ ïàêåòîâ Cabal) è íàáîð ïîïóëÿðíûõ áèáëèîòåê.
Ñåé÷àñ Haskell Platform â ýòî ðåêîìåíäîâàííûé áàçîâûé äèñòðèáóòèâ äëÿ ðàçðàáîò÷èêîâ. Ãîòîâûå ñáîðêè Haskell Platform äîñòóïíû äëÿ Windows, MacOS X è ðÿäà äèñòðèáóòèâîâ Linux.
[ïðàâèòü] Àëüòåðíàòèâíûå öåëåâûå ïëàòôîðìû
Áîëüøèíñòâî êîìïèëÿòîðîâ Õàñêåëÿ ñîçäàþò íåïîñðåäñòâåííî ìàøèííûé êîä äëÿ èñïîëüçóåìîé ïëàòôîðìû, íî åñòü íåñêîëüêî ïðîåêòîâ, ïîçâîëÿþùèõ êîìïèëèðîâàòü Õàñêåëü â êîä äëÿ âèðòóàëüíûõ ìàøèí èëè ãåíåðèðîâàòü êîä íà äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ. Ñòåïåíü çðåëîñòè è óðîâåíü ïîääåðæêè ïîäîáíûõ ïðîåêòîâ ñèëüíî ðàçíèòñÿ.
- LLVM:
- âèðòóàëüíàÿ ìàøèíà Java (JVM):
- Common Language Runtime (.Net):
- JavaScript:
Íåñêîëüêî èíòåðåñíûõ öåëåâûõ ïëàòôîðì äîñòóïíû ïðè èñïîëüçîâàíèè êîìïèëÿòîðà YHC, â ÷àñòíîñòè ñóùåñòâóþò èíòåðïðåòàòîð áàéò-êîäà YHC íà Ïèòîíå è êîíâåðòåð áàéò-êîäà YHC â Erlang Core, íî ýòè ðàçðàáîòêè ïîêà åù¸ ýêñïåðèìåíòàëüíû. Òàêæå ñóùåñòâóþò ðåàëèçàöèè ïîäìíîæåñòâ ÿçûêà íà ðàçíûõ öåëåâûõ ïëàòôîðìàõ.
[ïðàâèòü] Ðàñøèðåíèÿ ÿçûêà
- ìàêðîðàñøèðåíèå ñ êîíòðîëåì òèïîâ (Template Haskell);
- îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå (Oâ™Haskell, Haskell++ è Mondrian).
Ðàñøèðåíèÿ ðåàëèçàöèé ÿçûêà (îòíîñèòñÿ ê GHC):
- ðàçâèòèå ñèñòåìû òèïèçàöèè;
- ìíîãîïîòî÷íîñòü;
- ïàðàëëåëüíûå âû÷èñëåíèÿ;
- ðàñïðåäåë¸ííûå âû÷èñëåíèÿ;
- òðàíçàêöèîííàÿ ïàìÿòü (àíãë. Software transactional memory).
[ïðàâèòü] Ïðèìåðû
[ïðàâèòü] Âû÷èñëåíèå ôàêòîðèàëà
Ñëåäóþùèé ïðèìåð ïîêàçûâàåò ñèíòàêñèñ ÿçûêà Haskell ïðè ðåàëèçàöèè ôóíêöèè äëÿ âû÷èñëåíèÿ ôàêòîðèàëà:
fac :: Integer -> Integer fac 0 = 1 fac n | n > 0 = n * fac (n - 1)
Ýòî îïðåäåëåíèå îïèñûâàåò ïðîöåññ âû÷èñëåíèÿ ôàêòîðèàëà â âèäå ðåêóðñèâíîé ôóíêöèè. Ýòî îïðåäåëåíèå ïîõîæå íà òî, êîòîðîå ìîæíî íàéòè â ó÷åáíèêàõ ïî èíôîðìàòèêå. Áîëüøàÿ ÷àñòü èñõîäíîãî êîäà íà ÿçûêå Haskell ïîõîäèò íà ìàòåìàòè÷åñêóþ íîòàöèþ â àñïåêòàõ ñèíòàêñèñà è èñïîëüçîâàíèÿ, íàïðèìåð, âûøåïðèâåä¸ííûé ïðèìåð ìîæíî ïåðåïèñàòü â âèäå
fac n = product [1..n]
÷òî ñîîòâåòñòâóåò ìàòåìàòè÷åñêîìó îïðåäåëåíèþ ôàêòîðèàëà.
Ïåðâàÿ ñòðîêà â ïðèâåä¸ííîì âûøå îïðåäåëåíèè ÿâëÿåòñÿ íåîáÿçàòåëüíîé, òàê êàê îïðåäåëÿåò (âåðíåå, îãðàíè÷èâàåò) òèï ôóíêöèè, êîòîðûé ìîæåò áûòü âûâåäåí ñèñòåìîé òèïèçàöèè ñàìîñòîÿòåëüíî. Ýòà ñòðîêà ìîæåò áûòü ïðî÷èòàíà êàê: ôóíêöèÿ fac èìååò òèï (::) èç öåëîãî â öåëîå (Integer -> Integer). Ýòî çíà÷èò, ÷òî îíà ïîëó÷àåò íà âõîä îäèí öåëî÷èñëåííûé àðãóìåíò è âîçâðàùàåò ðåçóëüòàò òàêæå öåëîãî òèïà. Êàê ñêàçàíî âûøå, òèïû âñåõ ôóíêöèé ìîãóò áûòü âûâåäåíû àâòîìàòè÷åñêè, åñëè ïðîãðàììèñò íå óêàçàë èõ ÿâíî.
Âòîðàÿ ñòðîêà îñíîâàíà íà ìåõàíèçìå ñîïîñòàâëåíèÿ ñ îáðàçöàìè, êîòîðûé ÿâëÿåòñÿ âàæíîé îñîáåííîñòüþ ÿçûêà Haskell. Ýòîò ìåõàíèçì çàñòàâëÿåò èíòåðïðåòàòîð ÿçûêà ïðîáåãàòüñÿ ñâåðõó âíèç ïî ñòðîêàì îïðåäåëåíèÿ è íàõîäèòü ïåðâûé îáðàçåö (òî åñòü íàáîð ôîðìàëüíûõ ïàðàìåòðîâ, êîòîðûé ïîäõîäèò ïîä çíà÷åíèÿ ôàêòè÷åñêè ïåðåäàííûõ ïàðàìåòðîâ â ôóíêöèþ) è âûïîëíÿòü îïðåäåëåíèå, çàïèñàííîå ñ ýòèì îáðàçöîì.  äàííîì ñëó÷àå âòîðàÿ ñòðîêà îïðåäåëåíèÿ áóäåò âûáðàíà òîãäà, êîãäà ôàêòè÷åñêèé ïàðàìåòð ïðè âûçîâå ôóíêöèè fac áóäåò ðàâåí íóëþ.
 òðåòüåé ñòðîêå ïîìèìî ìåõàíèçìà ñîïîñòàâëåíèÿ ñ îáðàçöàìè èñïîëüçîâàíî îõðàíÿþùåå âûðàæåíèå â n > 0. Îíî ãàðàíòèðóåò, ÷òî ôóíêöèÿ íå áóäåò ðàáîòàòü äëÿ îòðèöàòåëüíûõ ÷èñåë, äëÿ êîòîðûõ ôàêòîðèàë íåîïðåäåë¸í. Åñëè îòðèöàòåëüíîå ÷èñëî áóäåò ïåðåäàíî â êà÷åñòâå ôàêòè÷åñêîãî ïàðàìåòðà â ôóíêöèþ fac, òî ïðîãðàììà îñòàíîâèòñÿ ñ ñîîáùåíèåì îá îøèáêå.
[ïðàâèòü] Êàëüêóëÿòîð
Ïðîñòåéøèé êàëüêóëÿòîð äëÿ âû÷èñëåíèÿ âûðàæåíèé â îáðàòíîé ïîëüñêîé çàïèñè ìîæåò áûòü îïðåäåë¸í íà ÿçûêå Haskell ïðè ïîìîùè îäíîé ôóíêöèè:
calc :: String -> Float calc = head . foldl f [] . words where f :: [Float] -> String -> [Float] f (x:y:zs) "+" = (y + x):zs f (x:y:zs) "-" = (y - x):zs f (x:y:zs) "*" = (y * x):zs f (x:y:zs) "/" = (y / x):zs f (x:y:zs) "FLIP" = y:x:zs f (x:zs) "ABS" = (abs x):zs f xs y = read y : xs
Èñõîäíàÿ ñòðîêà ñî âõîäíûì âûðàæåíèåì òóò ðàçáèâàåòñÿ ñòàíäàðòíîé ôóíêöèåé words íà ñïèñîê ñëîâ â ñòðîê ìåæäó ïðîáåëüíûìè ñèìâîëàìè â êîòîðûé îáðàáàòûâàåòñÿ ôóíêöèåé ëåâîñòîðîííåé ñâ¸ðòêè (foldl) ñëåâà íàïðàâî ïî îäíîìó ñëîâó ñ ïîìîùüþ ôóíêöèè f, êîòîðàÿ ïîääåðæèâàåò ðàáî÷èé ñïèñîê ïðî÷èòûâàåìûõ ÷èñåë è ïðîìåæóòî÷íûõ çíà÷åíèé (ïîíà÷àëó [] â ïóñòîé ñïèñîê) è èíòåðïðåòèðóåò êàæäîå âõîäíîå ñëîâî êàê îáîçíà÷åíèå àðèôìåòè÷åñêîé ôóíêöèè èëè êàê ÷èñëî, â õîäå âû÷èñëåíèÿ åþ îêîí÷àòåëüíîãî çíà÷åíèÿ âûðàæåíèÿ (êîòîðîå áóäåò ïåðâûì îñòàâøèìñÿ çíà÷åíèåì â ðàáî÷åì ñïèñêå ïî îêîí÷àíèè îáðàáîòêè ñïèñêà ñëîâ âõîäíîãî âûðàæåíèÿ, òàê ÷òî åãî ìîæíî äîñòàòü îòòóäà ñ ïîìîùüþ ñòàíäàðòíîé ôóíêöèè head).
Çäåñü (.) åñòü îïåðàòîð êîìïîçèöèè ôóíêöèé, (f . g) x = f (g x). Íàïðèìåð,
*Main> calc "1 2 3 + 4 * - ABS" 19.0
[ïðàâèòü] ×èñëà Ôèáîíà÷÷è
Äðóãîé ïðèìåð ïîêàçûâàåò ñïîñîá âû÷èñëåíèÿ áåñêîíå÷íîãî ñïèñêà ÷èñåë Ôèáîíà÷÷è çà ëèíåéíîå âðåìÿ:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Áåñêîíå÷íûé ñïèñîê çäåñü îïðåäåëåí ïðè ïîìîùè ìåõàíèçìà êîðåêóðñèè â ïîñëåäóþùèå çíà÷åíèÿ ñïèñêà çäåñü çàäàþòñÿ íà îñíîâå ïðåäûäóùèõ, ñ íà÷àëüíûìè 0 è 1 â êà÷åñòâå ïåðâûõ äâóõ ýëåìåíòîâ ñïèñêà, è âûðàæåíèåì-ãåíåðàòîðîì zipWith (+) fibs (tail fibs), âû÷èñëÿþùèì âñå ýëåìåíòû íà÷èíàÿ ñ òðåòüåãî íà îñíîâàíèè ïðåäøåñòâóþùèõ äâóõ, ÷åðåç ñòàíäàðòíóþ ôóíêöèþ zipWith (+) êîòîðàÿ ñóììèðóåò ïîïàðíî ýëåìåíòû äâóõ ñâîèõ âõîäíûõ ñïèñêîâ.
Ýòî îïðåäåëåíèå ÿâëÿåòñÿ ïðèìåðîì ïðèìåíåíèÿ ìåõàíèçìà ëåíèâûõ âû÷èñëåíèé, êîòîðûé ÿâëÿåòñÿ âàæíåéøåé ÷àñòüþ ÿçûêà Haskell. Äëÿ ïîíèìàíèÿ òîãî, êàê ýòî îïðåäåëåíèå ðàáîòàåò, ìîæíî ðàññìîòðåòü âû÷èñëåíèå ïåðâûõ ñåìè ÷èñåë Ôèáîíà÷÷è ñ åãî ïîìîùüþ:
fibs = 0 : 1 : 1 : 2 : 3 : 5 : 8 : ...
+ + + + + +
tail fibs = 1 : 1 : 2 : 3 : 5 : 8 : ...
= = = = = =
zipWith (+) = 1 : 2 : 3 : 5 : 8 : ...
fibs = 0 : 1 : 1 : 2 : 3 : 5 : 8 : ...
Òî æå ñàìîå ìîæåò áûòü çàïèñàíî òàêæå ïðè èñïîëüçîâàíèè îïðåäåëèòåëåé ñïèñêîâ,
fibs = 0 : 1 : [a + b | (a,b) <- zip fibs (tail fibs)]
èëè ðàñøèðåíèÿ ÿçûêà Haskell, ðåàëèçîâàííîãî â êîìïèëÿòîðå GHC (ïàðàëëåëèçàöèÿ îïðåäåëèòåëåé ñïèñêîâ, Parallel List Comprehensions):
fibs = 0 : 1 : [a + b | a <- fibs | b <- tail fibs]
èëè ñ ïîìîùüþ íàïðÿìóþ ñàìîðåôåðåíòíîé ãåíåðèðóþùåé ôóíêöèè:
fibs = 0 : 1 : next fibs where next (a: t@(b:_)) = (a+b) : next t
[ïðàâèòü] Ïðîñòûå ÷èñëà
 ýòèõ ïðèìåðàõ ïîêàçàíî, êàê ìîæíî èñïîëüçîâàòü ñïèñî÷íûå âûðàæåíèÿ (ãåíåðàòîðû ñïèñêîâ). Ðåàëèçàöèÿ íàõîæäåíèÿ âñåõ ïðîñòûõ ÷èñåë îáû÷íûì ïóò¸ì (ïðîâåðêà êàæäîãî ÷èñëà íà ïðîñòîòó):
-- îáùåå îïðåäåëåíèå (âñå íàòóðàëüíûå ÷èñëà > 1, êîòîðûå ÿâëÿþòñÿ ïðîñòûìè) primeNums = 2 : [n | n <- [3..], isPrime n] -- ×èñëî ïðîñòîå, åñëè ó íåãî íåò (ïðîñòûõ) äåëèòåëåé isPrime n = foldr (\p r-> p*p>n || (rem n p /= 0 && r)) True primeNums
èëè ïî-ñåãìåíòíûì ïåðåáîðîì äåëèòåëåé,
primesST = 2 : 3 : sieve 0 5 9 (drop 2 primesST) where sieve k x q ps = let fs = take k (tail primesST) in [n | n <- [x,x+2..q-2], all ((/=0).rem n) fs] ++ sieve (k+1) (q+2) (head ps^2) (tail ps)
à òàêæå ñ ïîìîùüþ ðåøåòà Ýðàòîñôåíà, â âàðèàíòå îãðàíè÷åííîãî ñïèñêà,
primesTo m = 2 : eratos [3,5..m] where eratos (x : xs) | x*x>m = x : xs | True = x : eratos (xs `minus` [x*x, x*x+2*x..m])
èëè, âîîáùå ãîâîðÿ, áåñêîíå÷íîãî ñïèñêà ïðîñòûõ ÷èñåë:
primes = 2 : ([3,5..] `minus` unionAll [[p*p, p*p+2*p..] | p <- primes']) where primes' = 3 : ([5,7..] `minus` unionAll [[p*p, p*p+2*p..] | p <- primes']) unionAll ((x:xs):t) = x : union xs (unionAll (pairs t)) pairs ((x:xs):ys:t) = (x : union xs ys) : pairs t
ñ èñïîëüçîâàíèåì êàíîíè÷åñêèõ ôóêöèé minus, union (â òîì ÷èñëå èç ïàêåòà Data.List.Ordered):
union (x:xs) (y:ys) = case compare x y of LT -> x : union xs (y:ys) EQ -> x : union xs ys GT -> y : union (x:xs) ys union a b = a ++ b minus (x:xs) (y:ys) = case compare x y of LT -> x : minus xs (y:ys) EQ -> minus xs ys GT -> minus (x:xs) ys minus a b = a
[ïðàâèòü] Îïèñàíèå èãðàëüíûõ êàðò
Ïðîñòîé ïðèìåð èñïîëüçîâàíèÿ àëãåáðàè÷åñêèõ òèïîâ äàííûõ äëÿ îïèñàíèÿ èãðàëüíûõ êàðò. Èäåíòèôèêàòîðû òèïîâ íà÷èíàþòñÿ ñ çàãëàâíûõ áóêâ. Èäåíòèôèêàòîðû ïåðåìåííûõ è ôóíêöèé â ñî ñòðî÷íûõ. Íîâûå àëãåáðàè÷åñêèå òèïû îïðåäåëÿþòñÿ êëþ÷åâûì ñëîâîì data. Ñèíîíèìû òèïîâ îïðåäåëÿþòñÿ êëþ÷åâûì ñëîâîì type.
-- Àëãåáðàè÷åñêèé òèï-ñóììà Ìàñòü («ïåðå÷èñëåíèå»). -- Çíà÷åíèåì òèïà Ìàñòü ìîæåò áûòü îäíî èç óêàçàííûõ ñïðàâà -- (èëè Ïèêè, èëè Òðåôû, èëè Áóáíû, èëè ×åðâû). -- «Ìàñòü» çäåñü âûñòóïàåò êîíñòðóêòîðîì _òèïà_, -- à «Ïèêè», «Òðåôû» è ò.ä. â êîíñòðóêòîðàìè _äàííûõ_. data Ìàñòü = Ïèêè | Òðåôû | Áóáíû | ×åðâû -- íåîáÿçàòåëüíîå àâòîìàòè÷åñêîå âûâåäåíèå ýêçåìïëÿðîâ êëàññîâ, -- ïîçâîëÿþùåå ïðåîáðàçîâûâàòü çíà÷åíèÿ â ñòðîêè (ôóíêöèåé show èç Show) -- è îáðàòíî (ôóíêöèåé read èç Read), à òàêæå ñðàâíèâàòü èõ ìåæäó ñîáîé -- (ôóíêöèÿìè êëàññîâ Eq è Ord). deriving (Show, Read, Eq, Ord) -- Àëãåáðàè÷åñêèé òèï-ñóììà Äîñòîèíñòâî data Äîñòîèíñòâî = Ñåì¸ðêà | Âîñüì¸ðêà | Äåâÿòêà | Äåñÿòêà | Âàëåò | Äàìà | Êîðîëü | Òóç deriving (Show, Read, Eq, Ord) -- Àëãåáðàè÷åñêèé òèï-ïðîèçâåäåíèå Êàðòà («òèï-êîðòåæ»). -- Çíà÷åíèÿ òèïà Êàðòà â êîìáèíàöèè çíà÷åíèé òèïîâ Äîñòîèíñòâî è Ìàñòü, -- îáúåäèí¸ííûå êîíñòðóêòîðîì äàííûõ Ê. -- ×àñòî èìåíà êîíñòðóêòîðà äàííûõ è êîíñòðóêòîðà òèïà ñîâïàäàþò. data Êàðòà = Ê Äîñòîèíñòâî Ìàñòü deriving (Show, Read, Eq, Ord) -- Ñèíîíèì ñïèñêà çíà÷åíèé òèïà Êàðòà. type Ðóêà = [Êàðòà] -- Ôóíêöèÿ, îïðåäåëÿþùàÿ, åñòü ëè â ðóêå ìàðüÿæ (êîðîëü è äàìà îäíîé ìàñòè). åñòüÌàðüÿæ :: Ðóêà -> Bool åñòüÌàðüÿæ êàðòû = -- äîñòàòî÷íî íàéòè ìàðüÿæ õîòÿ áû îäíîé ìàñòè any (åñòüÌàðüÿæÌàñòè) [Ïèêè, Òðåôû, Áóáíû, ×åðâû] where -- ïðîâåðèòü, åñòü ëè è äàìà, è êîðîëü çàäàííîé ìàñòè ì â ðóêå åñòüÌàðüÿæÌàñòè ì = (Ê Äàìà ì) `elem` êàðòû && (Ê Êîðîëü ì) `elem` êàðòû -- ïðèìåðû ðàçäà÷ ðóêà = [ Ê Äàìà Òðåôû, Ê Ñåì¸ðêà ×åðâû, Ê Êîðîëü Òðåôû, Ê Òóç Áóáíû ] ðóêà_áåç_ìàðüÿæà = [ Ê Äåñÿòêà Ïèêè, Ê Êîðîëü Ïèêè, Ê Äàìà ×åðâû ] main = do ïðîâåðèòü ðóêà ïðîâåðèòü ðóêà_áåç_ìàðüÿæà ïðîâåðèòü [] -- ïóñòàÿ ðàçäà÷à where ïðîâåðèòü êê = putStrLn ( (show êê) ++ " -> " ++ (show (åñòüÌàðüÿæ êê)) ) -- Âûâîä: -- [Ê Äàìà Òðåôû,Ê Ñåì¸ðêà ×åðâû,Ê Êîðîëü Òðåôû,Ê Òóç Áóáíû] -> True -- [Ê Äåñÿòêà Ïèêè,Ê Êîðîëü Ïèêè,Ê Äàìà ×åðâû] -> False -- [] -> False
[ïðàâèòü] ×èñëåííîå èíòåãðèðîâàíèå
×èñëåííîå èíòåãðèðîâàíèå
ìåòîäîì òðàïåöèé:
trapezeIntegrate f a b n = ((sum $ map f [a + h, a + 2*h .. b - h]) + t) * h where t = (f a + f b)/2 h = (b - a) / n main = do print $ trapezeIntegrate (\x -> x*sin x) 0 (2*pi) 100 -- Âûâîä: -6.281118086046067
[ïðàâèòü] Ïðîâåðêà ïàëèíäðîìîâ
Êàê âèäíî, Õàñêåëü ïðåêðàñíî ðàáîòàåò ñ Þíèêîäîì.
import Char -- ôóíêöèè toLower è isAlpha palindrom :: [Char] -> Bool palindrom s = norm == reverse norm where norm = map toLower $ filter isAlpha $ s test :: [Char] -> IO () test s = putStrLn $ s ++ ": " ++ show (palindrom s) main = do test "À â Åíèñåå â ñèíåâà" test "À ðîçà óïàëà íå íà ëàïó Àçîðà" test "Íå ðîçà óïàëà íà ëàïó Àçîðà" test "Ìèð êàê Ðèì" test "Ìèð íå Ðèì" test "Dogma: I am God" test "I prefer Pi" test "حوت فمه مفتوح" test "Ne mateno, bone tamen" -- Âûâîä: -- À â Åíèñåå â ñèíåâà: True -- À ðîçà óïàëà íå íà ëàïó Àçîðà: True -- Íå ðîçà óïàëà íà ëàïó Àçîðà: False -- Ìèð êàê Ðèì: True -- Ìèð íå Ðèì: False -- Dogma: I am God: True -- I prefer Pi: True -- حوت فمه مفتوح: True -- Ne mateno, bone tamen: True
[ïðàâèòü] Ïðèëîæåíèÿ, íàïèñàííûå íà ÿçûêå Haskell
Ìîçàè÷íûé îêîííûé ìåíåäæåð Xmonad äëÿ X Window System öåëèêîì íàïèñàí íà Õàñêåëå. Darcs â ðàñïðåäåë¸ííàÿ ñèñòåìà óïðàâëåíèÿ âåðñèÿìè ñ ðÿäîì óíèêàëüíûõ âîçìîæíîñòåé â íàïèñàíà íà Õàñêåëå. Ïåðâàÿ ðåàëèçàöèÿ êîìïèëÿòîðà è èíòåðïðåòàòîðà ÿçûêà Perl 6, Pugs, áûëà íàïèñàíà íà Õàñêåëå çà íåñêîëüêî ìåñÿöåâ. Êîìïèëÿòîð GHC ÷àñòî âûñòóïàåò ýêñïåðèìåíòàëüíîé ïëîùàäêîé äëÿ ïðîâåðêè íîâûõ âîçìîæíîñòåé ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ è îïòèìèçàöèè.
[ïðàâèòü] Êîììåð÷åñêèå ïðèëîæåíèÿ
Õàñêåëü âñ¸ ÷àùå èñïîëüçóåòñÿ â êîììåð÷åñêîé ñðåäå[20]. Ýòîìó ñïîñîáñòâóåò è ïðèíÿòàÿ â ñîîáùåñòâå òðàäèöèÿ âûïóñêàòü áèáëèîòåêè ïîä ëèáåðàëüíûìè ëèöåíçèÿìè (áîëåå 70 % ñâîáîäíî äîñòóïíûõ áèáëèîòåê ðàñïðîñòðàíÿþòñÿ íà óñëîâèÿõ ëèöåíçèé BSD, MIT èëè ÿâëÿþòñÿ îáùåñòâåííûì äîñòîÿíèåì).
Âîò ïðèìåðû íåêîòîðûõ êîììåð÷åñêèõ ïðèëîæåíèé, íàïèñàííûõ íà Õàñêåëå: Bluespec SystemVerilog, ÿçûê ïðîåêòèðîâàíèÿ è âåðèôèêàöèè ïîëóïðîâîäíèêîâûõ ñõåì, ÿâëÿåòñÿ ðàñøèðåíèåì Õàñêåëÿ[21]. Cryptol, êîììåð÷åñêèé ÿçûê äëÿ ðàçðàáîòêè è ïðîâåðêè êðèïòîãðàôè÷åñêèõ àëãîðèòìîâ, ðåàëèçîâàí íà Õàñêåëå. Ïðèìå÷àòåëüíî, ÷òî ïåðâîå ôîðìàëüíî âåðèôèöèðîâàííîå ìèêðîÿäðî seL4 áûëî òîæå íàïèñàíî íà Õàñêåëå.
Àêòèâíî ïðèìåíÿåòñÿ Õàñêåëü â îáëàñòè ôèíàíñîâîãî ïðîãðàììèðîâàíèÿ, àíàëèçà ðèñêîâ, â ñèñòåìàõ ïîääåðæêè ðåøåíèé. Õàñêåëü ïðèìåíÿþò ðàçðàáîò÷èêè ãåíåðàòîðà ãîðîäñêèõ ëàíäøàôòîâ äëÿ èãð è ìîäåëèðîâàíèÿ Gamr7[22]. Åñòü ïðèìåðû óñïåøíîãî ïðèìåíåíèÿ Õàñêåëÿ äëÿ ðàçðàáîòêè ÷àñòíûõ èíôîðìàöèîííûõ ñèñòåì â êîììåð÷åñêèõ îðãàíèçàöèÿõ, êàê â ìèðå, òàê è â ñòðàíàõ ÑÍÃ[23].
[ïðàâèòü] Ïðèëîæåíèÿ ñ îòêðûòûì èñõîäíûì êîäîì
Òàêæå íà Õàñêåëå íàïèñàíî ìíîãî ïðèëîæåíèé c îòêðûòûì èñõîäíûì êîäîì. Áîëüøèíñòâî èç íèõ äîñòóïíû â àðõèâå Hackage. Âîò íåêîòîðûå èç íèõ:
[ïðàâèòü] Áàçû äàííûõ
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Databases
- haskelldb â ñòðîãî òèïèçèðîâàííûé èíòåðôåéñ äîñòóïà ê SQL-áàçàì äàííûõ
- HDBC â óíèâåðñàëüíûé èíòåðôåéñ äîñòóïà ê ðåëÿöèîííûì áàçàì äàííûõ (ïîääåðæèâàþòñÿ SQLite, MySQL, PostgreSQL, ODBC)
- Takusen â áèáëèîòåêà äîñòóïà ê áàçàì äàííûõ, èñïîëüçóþùàÿ èíòåðôåéñ ëåâîé ñâ¸ðòêè
- åñòü áèáëèîòåêè äëÿ ðàáîòû ñ BerkeleyDB, CouchDB, MongoDB, Redis, TokyoCabinet/TokyoTyrant, SimpleDB, SQLite
[ïðàâèòü] Ãðàôèêà
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Graphics.
- Blobs â ðåäàêòîð äèàãðàìì
- Diagrams â áèáëèîòåêà äëÿ ïðîãðàììèðîâàíèÿ ñõåì è äèàãðàìì
- FieldTrip â áèáëèîòåêà äëÿ ôóíêöèîíàëüíîãî îïèñàíèÿ 3D-îáúåêòîâ
- Glome â îäèí èç ìíîæåñòâà òðàññèðîâùèêîâ ëó÷åé íà Õàñêåëå
- GLUT è OpenGL â èíòåðôåéñû äëÿ èñïîëüçîâàíèÿ GLUT è OpenGL èç Õàñêåëÿ
- GPipe â ôóíêöèîíàëüíûé èíòåðôåéñ äëÿ ïðîãðàììèðîâàíèÿ GPU
- Grapefruit â áèáëèîòåêà äëÿ ôóíêöèîíàëüíîãî ðåàêòèâíîãî ïðîãðàììèðîâàíèÿ ãðàôèêè è èíòåðôåéñîâ
- Haven â áèáëèîòåêà îòðèñîâêè ìàñøòàáèðóåìîé âåêòîðíîé ãðàôèêè
- HaskellCharts â áèáëèîòåêà äëÿ îòðèñîâêè äâóìåðíûõ ãðàôèêîâ
- SDL â èíòåðôåéñ äëÿ èñïîëüçîâàíèÿ libSDL èç Õàñêåëÿ
- Yampa â áèáëèîòåêà äëÿ ôóíêöèîíàëüíîãî ðåàêòèâíîãî ïðîãðàììèðîâàíèÿ ñ ïîìîùüþ ñòðåëîê
[ïðàâèòü] Ãðàôè÷åñêèå èíòåðôåéñû
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:GUI.
- Gtk2Hs â áèáëèîòåêà äëÿ ñîçäàíèÿ ãðàôè÷åñêèõ èíòåðôåéñîâ íà îñíîâå GTK+
- Grapefruit è wxFruit â áèáëèîòåêè äåêëàðàòèâíîãî ïðîãðàììèðîâàíèÿ èíòåðôåéñîâ (íà îñíîâå ðåàêòèâíîãî ïðîãðàììèðîâàíèÿ)
- qtHaskell â áèáëèîòåêà äëÿ ñîçäàíèÿ ãðàôè÷åñêèõ èíòåðôåéñîâ íà îñíîâå Qt
- wxHaskell â áèáëèîòåêà äëÿ ñîçäàíèÿ ãðàôè÷åñêèõ èíòåðôåéñîâ íà îñíîâå wxWidgets
[ïðàâèòü] Èãðû
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Games.
- bloxorz â òð¸õìåðíàÿ ëîãè÷åñêàÿ èãðà
- Frag â òð¸õìåðíûé øóòåð îò ïåðâîãî ëèöà
- monadius â äâóìåðíûé ñêðîëëåð
- Raincat â ðèñîâàííàÿ èãðà-ãîëîâîëîìêà
[ïðàâèòü] Èíòåðíåò
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Network
- gitit â Ýíöèêëî-ïëàòôîðìà, îñíîâàííàÿ íà ñèñòåìàõ êîíòðîëÿ âåðñèÿìè (darcs, git èëè mercurial)
- happstack â ôðåéìâîðê äëÿ âåá-ïðîãðàììèðîâàíèÿ (àíàëîã Django èëè Ruby on Rails)
- Twidge â òåðìèíàëüíûé êëèåíò äëÿ ìèêðîáëîããèíãà
[ïðàâèòü] Îáðàáîòêà òåêñòà
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Text
- HaXml â ìíîãîôóíêöèîíàëüíàÿ áèáëèîòåêà äëÿ ðàáîòû ñ XML
- HXT â êîìáèíàòîðíàÿ áèáëèîòåêà äëÿ ðàáîòû ñ XML, èñïîëüçóþùàÿ âûðàçèòåëüíûé ïðåäìåòíî-îðèåíòèðîâàííûé ÿçûê, îñíîâàííûé íà ñòðåëêàõ
- Leksah [1] â èíòåãðèðîâàííàÿ ñðåäà ðàçðàáîòêè (IDE), íàïèñàííàÿ íà Õàñêåëå è, â îñíîâíîì, äëÿ ðàçðàáîòêè íà Õàñêåëå; ïîääåðæèâàåò íàâèãàöèþ ïî èñõîäíûì òåêñòîì, «óìíîå» àâòîäîïîëíåíèå, îòëàäêó è ñáîðêó ïàêåòîâ.
- Pandoc â óíèâåðñàëüíûé êîíâåðòåð òåêñòà ìåæäó ðàçëè÷íûìè ÿçûêàìè ðàçìåòêè
- Parsec â êîìáèíàòîðíàÿ áèáëèîòåêà äëÿ ñèíòàêñè÷åñêîãî àíàëèçà
- The Grammatical Framework â áèáëèîòåêà äëÿ ðàáîòû ñ òåêñòîì íà åñòåñòâåííûõ ÿçûêàõ
- Yi â ïîäîáíûé Emacs-ó òåêñòîâûé ðåäàêòîð, èñïîëüçóåò Õàñêåëü òàêæå è â êà÷åñòâå ñêðèïòîâîãî ÿçûêà
[ïðàâèòü] Ïàðàëëåëüíîå, ìíîãîçàäà÷íîå è ìíîãîïîòî÷íîå ïðîãðàììèðîâàíèå
- CHP â Communicating Haskell Processes, áèáëèîòåêà, ðåàëèçóþùàÿ ìîäåëü ïàðàëëåëüíûõ ïðîöåññîâ áåç îáùåé ïàìÿòè
- Data Parallel Haskell â ðàñøèðåíèå ÿçûêà, îáåñïå÷èâàþùèå ïàðàëëåëèçì äàííûõ íà ìíîãîÿäåðíûõ ïðîöåññîðàõ
- parallel â ñòàíäàðòíàÿ áèáëèîòåêà äëÿ ïàðàëëåëüíîãî ïðîãðàììèðîâàíèÿ
- STM â áèáëèîòåêà ðåàëèçóþùàÿ Software Transactional Memory
[ïðàâèòü] Ðàçðàáîòêà
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Development
- alex â ãåíåðàòîð ëåêñè÷åñêèõ àíàëèçàòîðîâ
- cabal-install â èíñòðóìåíò äëÿ ñåòåâîé óñòàíîâêè, àâòîìàòè÷åñêîé ñáîðêè è ðàçâ¸ðòûâàíèÿ ïðèëîæåíèé íà Haskell
- happy â ãåíåðàòîð ñèíòàêñè÷åñêèõ àíàëèçàòîðîâ
- haddock â èíñòðóìåíò àâòîìàòè÷åñêîé ãåíåðàöèè äîêóìåíòàöèè äëÿ áèáëèîòåê Haskell
- HUnit â áèáëèîòåêà äëÿ ìîäóëüíîãî òåñòèðîâàíèÿ
- QuickCheck â áèáëèîòåêà äëÿ àâòîìàòè÷åñêîãî òåñòèðîâàíèÿ
[ïðàâèòü] Ñèñòåìíûå ïðîãðàììû
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:System
- Darcs â ïðîäâèíóòàÿ ðàñïðåäåë¸ííàÿ ñèñòåìà êîíòðîëÿ âåðñèé
- House â îïåðàöèîííàÿ ñèñòåìà, íàïèñàííàÿ íà Õàñêåëå
- Xmonad â ïîïóëÿðíûé ìîçàè÷íûé ìåíåäæåð îêîí
- Himerge â ãðàôè÷åñêàÿ îáîëî÷êà äëÿ Emerge â ïàêåòíîãî ìåíåäæåðà Gentoo
- FreeArc â àðõèâàòîð
[ïðàâèòü] ßçûêè è êîìïèëÿòîðû
Áîëåå ïîëíûé ñïèñîê ñì. â Hackage:Language
- Agda â ÿçûê ïðîãðàììèðîâàíèÿ ñ çàâèñèìûìè òèïàìè è äîêàçàòåëü òåîðåì
- Curry â ôóíêöèîíàëüíûé ëîãè÷åñêèé ÿçûê Curry
- cpphs â ðåàëèçàöèÿ ïðåïðîöåññîðà ÿçûêà Ñè
- Epigram â ÿçûê ïðîãðàììèðîâàíèÿ ñ çàâèñèìûìè òèïàìè
- Flapjax â ÿçûê äëÿ ðåàêòèâíîãî ïðîãðàììèðîâàíèÿ âåá-ïðèëîæåíèé
- Language.Python â áèáëèîòåêà ëåêñè÷åñêîãî è ñèíòàêñè÷åñêîãî àíàëèçà êîäà íà ÿçûêå Python
- Language.C â áèáëèîòåêà àíàëèçà è ãåíåðàöèè êîäà íà ÿçûêå Ñè
- Lava â ÿçûê àïïàðàòíûõ ñõåì
- llvm â èíòåðôåéñ äëÿ ðàáîòû ñ LLVM èç Õàñêåëÿ
- Pugs â êîìïèëÿòîð è èíòåðïðåòàòîð ÿçûêà Perl 6
- WebBits â áèáëèîòåêà äëÿ ðàáîòû ñ êîäîì íà ÿçûêå Javascript
[ïðàâèòü] Ñì. òàêæå
- Ñðàâíåíèå âîçìîæíîñòåé Haskell ñ äðóãèìè ÿçûêàìè ñì. â ñòàòüå Ñðàâíåíèå ÿçûêîâ ïðîãðàììèðîâàíèÿ
[ïðàâèòü] Ïðèìå÷àíèÿ
- â‘ Curry, Haskell (1934), "Functionality in Combinatory Logic", Proceedings of the National Academy of Sciences, vol. 20, pp. 584590
- â‘ Curry, Haskell B. & Feys, Robert (1958), Combinatory Logic Vol. I, Amsterdam: North-Holland, with 2 sections by William Craig, see paragraph 9E
- â‘ HaskellWiki â ïî ñîñòîÿíèþ íà 05.02.2010.
- â‘ The Haskell 98 Language Report â ïîëó÷åíî 05.02.2010
- â‘ Haskell Prime
- â‘ Simon Marlow, Announcing Haskell 2010
- â‘ The Haskell 98 Foreign Function Interface 1.0: An Addendum to the Haskell 98 Report
- â‘ Ðåàëèçàöèè ÿçûêà Õàñêåëü (àíãë.)
- â‘ The Haskell Platform
- â‘ Merge Request: LLVM Code Generator for GHC
- â‘ The Glasgow Haskell Compiler and LLVM
- â‘ Smoking fast Haskell code using GHCâ™s new LLVM codegen
- â‘ LambdaVM
- â‘ JVM-Bridge
- â‘ The Jaskell Project Home Page
- â‘ Running Haskell on the CLR (using UHC)
- â‘ 1.5.1 Why isnâ™t GHC available for .NET or on the JVM?
- â‘ êîäîãåíåðàòîð JavaScript äëÿ GHC(íåäîñòóïíàÿ ññûëêà)
- â‘ Yhc/Javascript, YCR2JS, a Converter of Yhc Core to Javascript
- â‘ (àíãë.)Êîììåð÷åñêèå ïðèìåíåíèÿ ÿçûêà Õàñêåëü
- â‘ Bluespec
- â‘ Gamr7: UrbanPAD. The Software for 3D city & buildings creation.
- â‘ Àñòàïîâ Äìèòðèé Èñïîëüçîâàíèå Haskell ïðè ïîääåðæêå êðèòè÷åñêè âàæíîé äëÿ áèçíåñà èíôîðìàöèîííîé ñèñòåìû // Ïðàêòèêà ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ : Æóðíàë. â 2009. â â„– 2. â Ñ. 53â69.
[ïðàâèòü] Ëèòåðàòóðà
- Bryan Oâ™Sullivan, John Goerzen, Don Stewart. Real World Haskell â Oâ™Reilly, 2008â710 °C. ISBN 0-596-51498-0. ISBN 978-0-596-51498-3
- Äóøêèí Ðîìàí Âèêòîðîâè÷. Ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå íà ÿçûêå Haskell / Ãë. ðåä. Ä. À. Ìîâ÷àí;. â Ì.: ÄÌÊ Ïðåññ,, 2008. â 544 ñ., èë. ñ. â 1500 ýêç. â ISBN 5-94074-335-8
- Graham Hutton. «Programming in Haskell». Cambrige University Press. ISBN 978-0-521-87172-3. ISBN 978-0-521-69269-4
- Kees Doets, Jan van Eijck. «The Haskell Road to Logic, Maths and Programming». ISBN 0-9543006-9-6.
[ïðàâèòü] Ññûëêè
- http://www.haskell.org/ â ñàéò, ïîñâÿù¸ííûé ôóíêöèîíàëüíîìó ïðîãðàììèðîâàíèþ â îáùåì è ÿçûêó Haskell â ÷àñòíîñòè. Ñîäåðæèò ðàçëè÷íûå ñïðàâî÷íûå ìàòåðèàëû, ñïèñîê èíòåðïðåòàòîðîâ è êîìïèëÿòîðîâ Haskell (â íàñòîÿùèé ìîìåíò, âñå èíòåðïðåòàòîðû è êîìïèëÿòîðû áåñïëàòíû). Êðîìå òîãî, èìååòñÿ îáøèðíûé ñïèñîê ññûëîê íà ðåñóðñû ïî òåîðèè ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ è äðóãèì ÿçûêàì (Standard ML, Clean).
- Ïîëíûé ïåðåâîä îïèñàíèÿ ÿçûêà Haskell íà ðóññêèé ÿçûê.
- Ñàéò-êíèãà «Learn You a Haskell for Great Good!».
- http://www.roman-dushkin.narod.ru/fp.html â Êóðñ ëåêöèé ïî ôóíêöèîíàëüíîìó ïðîãðàììèðîâàíèþ, ÷èòàåìûé â ÌÈÔÈ ñ 2001 ãîäà.
| Îñíîâíûå ÿçûêè ïðîãðàììèðîâàíèÿ (ñðàâíåíèå IDE èñòîðèÿ õðîíîëîãèÿ) | |
|---|---|
| Èñïîëüçóåìûå â ðàçðàáîòêå |
Àäà APL ßçûê àññåìáëåðà ActionScript ABAP/4 AutoIt AWK Áåéñèê Ñè Êîáîë C++ C# Cω Clarion Clojure ColdFusion Common Lisp D dBase Delphi Eiffel Erlang Euphoria F# Ôîðò Ôîðòðàí Gambas Go Groovy HAL/S Haskell Icon Java JavaScript Limbo Lua Object Pascal Objective-C OCaml Oz Parser Ïàñêàëü Perl PHP PowerBASIC Python ÏË/1 Ïðîëîã Ruby Scala Scheme Smalltalk SQL PL/SQL Tcl Vala Visual Basic (.NET) |
| Àêàäåìè÷åñêèå | |
| IEC 61131-3 | |
| Ïðî÷èå | |
| Ýçîòåðè÷åñêèå | |
| Âèçóàëüíûå | |
