ñòàòüèGNU Free Documentation License ìàòåðèàëû âçÿòû èç Âèêèïåäèè Ñòàòüÿ áûëà èçìåíåíà. Îðèãèíàë ñòàòüè.

Haskell

Ìàòåðèàë èç Ýíöèêëîïåäèè â ñâîáîäíîé ýíöèêëîïåäèè
Ïåðåéòè ê: íàâèãàöèÿ, ïîèñê
Haskell
Ëîãîòèï Haskell
Êëàññ ÿçûêà:

ôóíêöèîíàëüíûé, ëåíèâûé, ìîäóëüíûé

Òèï èñïîëíåíèÿ:

êîìïèëèðóåìûé, èíòåðïðåòèðóåìûé

Ïîÿâèëñÿ â:

1990

Òèïèçàöèÿ äàííûõ:

ñòàòè÷åñêàÿ, ñòðîãàÿ, ñ âûâîäîì òèïîâ

Îñíîâíûå ðåàëèçàöèè:

GHC, HUGS, NHC, YHC

Äèàëåêòû:

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.org

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 ìîæíî âûäåëèòü ñëåäóþùèå:

Ñî âðåìåíè ïðèíÿòèÿ ïîñëåäíåãî ñòàíäàðòà ÿçûêà (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:
    • ïàò÷ äëÿ GHC[10], äîáàâëÿþùèé ãåíåðàòîð êîäà äëÿ LLVM, â íàñòîÿùåå âðåìÿ âêëþ÷åí â êîìïèëÿòîð GHC[11]; èñïîëüçîâàíèå LLVM ïîçâîëÿåò äîñòè÷ü áîëüøåé ïðîèçâîäèòåëüíîñòè íà ðÿäå çàäà÷[12].
    • àëüòåðíàòèâíûé êîäîãåíåðàòîð â UHT (ðàáîòîñïîñîáåí ÷àñòè÷íî)
  • âèðòóàëüíàÿ ìàøèíà Java (JVM):
    • LambdaVM[13] â ïàò÷ äëÿ GHC, äîáàâëÿþùèé ãåíåðàòîð áàéòêîäà JVM
    • jvm-bridge[14] â ìîñò ìåæäó Haskell è JVM (äëÿ GHC)
    • jaskell[15] â ãåíåðàòîð áàéò-êîäà JVM (âåðîÿòíî çàáðîøåí)
    • àëüòåðíàòèâíûé êîäîãåíåðàòîð â UHT (ðàáîòîñïîñîáåí ïî÷òè ïîëíîñòüþ)
  • Common Language Runtime (.Net):
    • ïðîòîòèï ãåíåðàòîðà MSIL-êîäà[16] äëÿ êîìïèëÿòîðà EHT/UHT
    • íåêîòîðûå ïðîåêòû ïî ïîääåðæêå CLR óïîìèíàþòñÿ â GHC FAQ[17], íà íà÷àëî 2010 ãîäà èõ ñîñòîÿíèå íå ÿñíî
  • JavaScript:
    • êîäîãåíåðàòîð JavaScript äëÿ GHC[18] â ïàò÷ äëÿ GHC ïîçâîëÿþùèé êîìïèëèðîâàòü ïðîãðàììû â JavaScript-êîä
    • Ycr2Js[19] â êîíâåðòåð áàéò-êîäà êîìïèëÿòîðà YHC â JavaScript

Íåñêîëüêî èíòåðåñíûõ öåëåâûõ ïëàòôîðì äîñòóïíû ïðè èñïîëüçîâàíèè êîìïèëÿòîðà YHC, â ÷àñòíîñòè ñóùåñòâóþò èíòåðïðåòàòîð áàéò-êîäà YHC íà Ïèòîíå è êîíâåðòåð áàéò-êîäà YHC â Erlang Core, íî ýòè ðàçðàáîòêè ïîêà åù¸ ýêñïåðèìåíòàëüíû. Òàêæå ñóùåñòâóþò ðåàëèçàöèè ïîäìíîæåñòâ ÿçûêà íà ðàçíûõ öåëåâûõ ïëàòôîðìàõ.

[ïðàâèòü] Ðàñøèðåíèÿ ÿçûêà

Ðàñøèðåíèÿ ðåàëèçàöèé ÿçûêà (îòíîñèòñÿ ê GHC):

[ïðàâèòü] Ïðèìåðû

[ïðàâèòü] Âû÷èñëåíèå ôàêòîðèàëà

Ñëåäóþùèé ïðèìåð ïîêàçûâàåò ñèíòàêñèñ ÿçûêà 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

[ïðàâèòü] ×èñëåííîå èíòåãðèðîâàíèå

×èñëåííîå èíòåãðèðîâàíèå \int\limits_0^{2\pi}x\sin x\,{\rm d}x = -2\pi ìåòîäîì òðàïåöèé:

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.

[ïðàâèòü] Èíòåðíåò

Áîëåå ïîëíûé ñïèñîê ñì. â 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

[ïðàâèòü] Ñèñòåìíûå ïðîãðàììû

Áîëåå ïîëíûé ñïèñîê ñì. â 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

[ïðàâèòü] Ñì. òàêæå

[ïðàâèòü] Ïðèìå÷àíèÿ

  1. â‘ Curry, Haskell (1934), "Functionality in Combinatory Logic", Proceedings of the National Academy of Sciences, vol. 20, pp. 584590 
  2. â‘ Curry, Haskell B. & Feys, Robert (1958), Combinatory Logic Vol. I, Amsterdam: North-Holland , with 2 sections by William Craig, see paragraph 9E
  3. â‘ HaskellWiki â ïî ñîñòîÿíèþ íà 05.02.2010.
  4. â‘ The Haskell 98 Language Report â ïîëó÷åíî 05.02.2010
  5. â‘ Haskell Prime
  6. â‘ Simon Marlow, Announcing Haskell 2010
  7. â‘ The Haskell 98 Foreign Function Interface 1.0: An Addendum to the Haskell 98 Report
  8. â‘ Ðåàëèçàöèè ÿçûêà Õàñêåëü (àíãë.)
  9. â‘ The Haskell Platform
  10. â‘ Merge Request: LLVM Code Generator for GHC
  11. â‘ The Glasgow Haskell Compiler and LLVM
  12. â‘ Smoking fast Haskell code using GHCâ™s new LLVM codegen
  13. â‘ LambdaVM
  14. â‘ JVM-Bridge
  15. â‘ The Jaskell Project Home Page
  16. â‘ Running Haskell on the CLR (using UHC)
  17. â‘ 1.5.1 Why isnâ™t GHC available for .NET or on the JVM?
  18. â‘ êîäîãåíåðàòîð JavaScript äëÿ GHC(íåäîñòóïíàÿ ññûëêà)
  19. â‘ Yhc/Javascript, YCR2JS, a Converter of Yhc Core to Javascript
  20. â‘  (àíãë.)Êîììåð÷åñêèå ïðèìåíåíèÿ ÿçûêà Õàñêåëü
  21. â‘ Bluespec
  22. â‘ Gamr7: UrbanPAD. The Software for 3D city & buildings creation.
  23. â‘ Àñòàïîâ Äìèòðèé Èñïîëüçîâàíèå 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

[ïðàâèòü] Ññûëêè

Ïðîñòðàíñòâà èì¸í

Âàðèàíòû
Ïðîñìîòðû
Äåéñòâèÿ