Haskell ստանդարտացված, ընդհանուր նշանակության մաքուր ֆունկցիոնալ ծրագրավորման լեզու: Տիպի համակարգը ամբողջական է, ստատիկ, ավտոմատ տիպի որոշմամբ, հիմնված Հինդլի-Միլներ տիպի համակարգի վրա: Քանի որ լեզուն ֆունկցիոնալ է, կառավարման հիմնական կառուցվածքը ֆունկցիան է:

Haskell
Изображение логотипа
Տեսակpurely functional programming language?, non-strict programming language?, modular programming language?, ծրագրավորման ինտերպրետացվող լեզու, off-side rule language?, ծրագրավորման կոմպիլյացվող լեզու և ծրագրավորման լեզու
Առաջացել է1990
ՍտեղծողPaul Hudak?[1], Lennart Augustsson?[2], John Hughes?[3], Simon Peyton Jones?[4], Erik Meijer?[4] և Philip Wadler?[4]
ՆախագծողLennart Augustsson?, Warren Burton?, Kevin Hammond?, Paul Hudak?, John Hughes?, Thomas Johnsson?, Simon Peyton Jones?, John Launchbury?, Erik Meijer?, Alastair Reid? և Philip Wadler?
Ընդլայնումներ.hs և .lhs
ՕՀWindows և յունիքսանման օպերացիոն համակարգ
Ընթացիկ տարբերակHaskell 2010 (հուլիս 2010)[5]
Ներշնչվել էԼիսպ, ML, Miranda?[4], Orwell?[4], Lazy ML?[4] և Clean?[4]
Անվանված էՀասկել Կարրի[4]
Կայքhaskell.org(անգլ.)
 Haskell Վիքիպահեստում

Լեզվի տարբերակիչ առանձնահատկությունն այն է, որ նա լուրջ վերաբերմունք ունի տիպավորման նկատմամբ։ Հիմնականում դրա շնորհիվ է, որ լեզուն անվանվել է տիպի տեսաբան և կոմբինատորային տրամաբանության գյուտարար Հասքել Քարիի անունով:

Այս լեզուն ունի հնարավորություն ծրագրավորման այլ լեզուների կոդի հետ փոխազդելու միջոցներ։ Ներկառուցված է բազմաֆունկցիոնալ և զուգահեռ ծրագրավորման աջակցություն, մշակված գործիքներ (ավտոմատ թեստավորում, վրիպազերծման և պրոֆիլավորման գործիքներ, այդ թվում՝ զուգահեռ ծրագրերի համար), կան մի քանի հազար բաց կոդով գրադարաններ:

Պատմություն

խմբագրել

Haskell-ը պատկանում է ML լեզուների ընտանիքին։ Նրա վրա ուղղակիորեն ազդել է Միրանդա լեզուն, որը մշակվել է 1985 թվականին Դեյվիդ Թերները: Միրանդան առաջին մաքուր ֆունկցիոնալ լեզուն էր, որն ուներ կոմերցիոն աջակցություն և համեմատաբար տարածված էր 1980-ականներին, բայց մնաց սեփական ծրագրային ապահովման վրա: Սա դժվարացրեց զարգացնել և ուսումնասիրել ֆունկցիոնալ ծրագրավորման հնարավորությունները, ուստի ընդամենը մի քանի տարվա ընթացքում հայտնվեցին ավելի քան մեկ տասնյակ նմանատիպ լեզուներ: Տարբեր մշակողների ջանքերը միավորելու համար 1987 թվականին Օրեգոնի ֆունկցիոնալ ծրագրավորման լեզուների և համակարգչային ճարտարապետության կոնֆերանսում (FPCA'87), որոշվեց ստեղծել հանձնաժողով՝ բաց ստանդարտով մշակելու համար:

1990 թվականին առաջարկվեց լեզվի առաջին տարբերակը՝ Haskell 1.0։ Հետագայում հանձնաժողովի աշխատանքները շարունակվեցին, և 1999 թվականին լույս տեսավ «Haskell 98 զեկույցը» [6], որը երկար տարիներ դարձավ լեզվի կայուն չափանիշ։ Լեզուն, այնուամենայնիվ, շարունակեց արագ զարգանալ, քանի որ GHC կոմպիլյատորը դե ֆակտո ստանդարտ էր նոր հնարավորությունների համար:

Լեզվի նոր տարբերակների մշակումը բաց է, այս գործընթացը կոչվում է Haskell' [7] (Haskell Prime [ˈhæskəl praɪm])։ Յուրաքանչյուր ոք կարող է իր առաջարկները ներկայացնել քննարկման, առաջարկները քննարկվում են ամբողջ տարվա ընթացքում, հանձնաժողովն ընտրում և հայտարարում է այն առաջարկները, որոնք պատրաստ են ընդունելու, ձևավորվում է նոր հանձնաժողով և մինչև տարեվերջ պատրաստվում է լեզվի նոր տարբերակը։ Այսպիսով, լեզվի նոր տարբերակներ այժմ կարող են հայտնվել ամեն տարի: Ծրագրով նախատեսվում է որոշ վերանայումներ հայտարարել «կարևոր» և պահպանել նման վերանայումները երկարատև ժամանակի ընթացքում:

Haskell 2010 լեզվի տարբերակը հայտարարվել է 2009 թվականի վերջին [8], սակայն վերջին «նշանակալի» տարբերակը (ստանդարտ) մնում է Haskell 98-ը։

Լեզվի առանձնահատկությունները

խմբագրել

Haskell լեզվի հիմնական բնութագրերը հետևյալն են

  • կողմնակի ազդեցությունների անթույլատրելիությունը ( լեզվի մաքրություն )։ Կողմնակի էֆեկտներով ծրագրեր գրելու ունակություն, առանց խախտելու ֆունկցիոնալ ծրագրավորման պարադիգմը՝ օգտագործելով մոնադներ .
  • ստատիկ ուժեղ ամբողջական տիպավորում ավտոմատ տիպի որոշմամբ՝ հիմնված Հինդլի-Միլներ տիպավորման վրա;
  • ավելի բարձր կարգի գործառույթներ, ներառյալ լամբդա արտահայթությունները ;
  • մասնակի կիրառում ;
  • նմուշների համապատասխանություն (անգլ.՝ pattern matching), ֆունկցիոնալ նմուշներ, որոնք պահպանում են արտահայտությունները
  • հանրահաշվական տվյալների տեսակները, ներառյալ կեղծ անսահմանները
  • ցուցակի ընդգրկում;
  • Արտաքին գործառույթների ինտերֆեյսի միջոցով [9] իմպերատիվ ծրագրավորման լեզուներով իրականացվող ծրագրերի հետ ինտեգրվելու հնարավորություն:

Վերջին լեզվական ստանդարտի (Haskell'98) ընդունումից ի վեր, առաջատար լեզվական իրականացումները (ghc և hugs) լրացվել են բազմաթիվ լրացուցիչ հնարավորություններով։

  • Ավելի բարձր աստիճանի պարամետրային պոլիմորֆիզմ տիպի փոփոխականների քանակականացման պատճառով - բնականաբար, բացառելով տիպի եզրակացությունը .
  • ֆունկցիոնալ կախվածություններ.

Լեզվի իրականացումը

խմբագրել

Haskell լեզվի մի քանի իրականացում կա [10]: Որոշ իրականացումներ կենտրոնացած են գործնական կիրառությունների վրա, մինչդեռ մյուսները հիմնականում ակադեմիական հետաքրքրություն են ներկայացնում:

Կոմպիլյատորներ և ինտերպրետատորներ

խմբագրել

Գործնականում ամենատարածվածը [11] օպտիմիզացնող GHC կոմպիլյատորն է, որը ստեղծում է արագ կոդ և թույլ է տալիս օգտագործել բազմաթիվ լեզուների ընդլայնումներ։ GHC-ն կարող է օպտիմիզացնել ծրագրերի և՛ արագությունը, և՛ կոմպակտությունը, ինչպես նաև կարող է ստեղծել բազմաֆունկցիոնալ և զուգահեռացված կոդ: GHC-ն աշխատում է Windows, MacOS X և Unix-ի նման մի քանի հարթակներում (Linux, *BSD, Solaris): GHC-ն Haskell պլատֆորմի ստանդարտ կոմպիլյատորն է, և դրա վրա է, որ առաջին անգամ փորձարկվում են բոլոր նոր գրադարանները [12]:

Լեզվի մեկ այլ հայտնի իրականացում HUGS թարգմանիչն է: Այն գրված է C- ով, ունի փոքր բաշխման չափ և աշխատում է գրեթե բոլոր հարթակներում։ HUGS-ն ապահովում է ինտերակտիվ ծրագրավորման միջավայր, բայց կարող է նաև գործարկել Haskell ծրագրերը սկրիպտային լեզուների ոճով: Windows-ի օգտվողները կարող են օգտվել WinHugs գրաֆիկական ինտերակտիվ միջավայրից: Քանի որ HUGS-ը թարգմանիչ է, դրանում աշխատող ծրագրերն ավելի դանդաղ են աշխատում, քան Haskell կոմպիլյատորների մեծամասնության կողմից արտադրված կոդը: HUGS-ը հաճախ առաջարկվում է որպես լեզվի ուսուցման միջավայր: HUGS-ը լիովին աջակցում է Haskell 98 լեզվի ստանդարտը, ինչպես նաև լեզվի ամենատարածված ընդլայնումներից մի քանիսը:

Այլ հայտնի իրականացումներ [13]

  • nhc98-ը արագ կոմպիլյատոր է, որն աջակցում է Haskell 98 ստանդարտին, որը գրված է Haskell 98–ով; հասանելի է բոլոր Unix-ի նման հարթակների համար, ներառյալ MacOS X-ը և Windows/cygwin-ը;
  • YHC (York Haskell Compiler) - որի նպատակն է լինել ավելի շարժական և արդյունավետ, աջակցում է Hat debugger-ին, առաջացնում է միջանկյալ բայթկոդ, որը կարող է օգտագործվել ծրագրավորման այլ լեզուներով կոդ ստեղծելու համար.
  • UHC (Utrecht Haskell Compiler) - կոմպիլյատոր, որը գրեթե ամբողջությամբ աջակցում է Haskell 98-ին, ինչպես նաև որոշ ընդլայնումներ, աջակցում է գլոբալ ծրագրերի վերլուծություն, ունի մի քանի կոդերի գեներատորներ, այդ թվում՝ գրեթե լիովին ֆունկցիոնալ JVM կոդերի գեներատոր, LLVM-ի կոդերի գեներատորներ և մշակման փուլում գտնվող CLR, աշխատում է Unix-ի նման համակարգերի վրա (ներառյալ MacOS X և Windows/cygwin);
  • HBI և HBC - թարգմանիչ և կազմող, որոնք աջակցում են Haskell 98 ստանդարտին որոշ ընդլայնումներում, աշխատում է հենց Linux-ով
  • LHC (The Luxurious LHC Haskell Optimization System) այլընտրանքային կոդերի գեներատոր է GHC-ի համար, որն աջակցում է ծրագրի գլոբալ ցածր մակարդակի օպտիմիզացում։
  • jhc-ն փորձարարական կոմպիլյատոր է՝ գլոբալ ծրագրերի օպտիմալացման հնարավորությունները ուսումնասիրելու համար.
  • Yale Haskell-ը ում Haskell լեզվի վաղ իրականացումն է Lisp ծրագրավորման լեզվով :

Haskell Platform

խմբագրել

2009 թվականին ձևավորվեց Haskell պլատֆորմի [14] հայեցակարգը՝ լեզվի ստանդարտ բաշխում, որը ներառում է, բացի կոմպիլյատորից (GHC), նաև լրացուցիչ գործիքներ (Cabal փաթեթի կառուցման և տեղակայման համակարգ) և մի շարք հանրաճանաչ գրադարաններ։

2022 թվականի դրությամբ Haskell Platform-ը համարվում է Haskell-ը տեղադրելու հնացած միջոց:

Այլընտրանքային թիրախային հարթակներ

խմբագրել

Haskell կոմպիլյատորների մեծամասնությունը ուղղակիորեն արտադրում է մեքենայական կոդ այն պլատֆորմի համար, որն օգտագործում եք, բայց կան մի քանի նախագծեր, որոնք թույլ են տալիս կոդ արտադրել վիրտուալ մեքենաների համար կամ ստեղծել կոդ այլ ծրագրավորման լեզուներով: Նման նախագծերի հասունությունը և աջակցության մակարդակը տարբերվում են:

  • Ընդհանուր լեզու Runtime (.Net):
    • MSIL կոդերի գեներատորի նախատիպ [15] EHT/UHT կոմպիլյատորի համար
    • CLR-ին աջակցելու որոշ ծրագրեր նշված են GHC FAQ-ում [16], որոնց կարգավիճակը 2010 թվականի սկզբին պարզ չէ:
  • JavaScript:
    • JavaScript կոդերի գեներատոր GHC-ի համար [17] - GHC-ի համար, որը թույլ է տալիս ծրագրերը կազմել JavaScript կոդի մեջ:
    • Ycr2Js [18] - YHC կոմպիլյատոր բայթկոդի փոխարկիչ JavaScript-ին
    • Fay-ը Haskell-ի JavaScript-ի կոմպիլյատոր է
    • Ճարտարապետության նկարագրության լեզուներ (Verilog/VHDL).
      • Clash [19]-ը ASIC-ների մշակման և FPGA-ների ծրագրավորման այլընտրանքային միջոց է

YHC կոմպիլյատորի միջոցով հասանելի են մի քանի հետաքրքիր թիրախային հարթակներ, մասնավորապես՝ Python-ում YHC բայթկոդի թարգմանիչը և YHC բայթկոդը Erlang Core փոխարկիչում, բայց դրանք դեռ փորձնական են: Կան նաև լեզվի ենթաբազմությունների ներդրում տարբեր թիրախային հարթակներում։

Լեզուների ընդլայնումներ

խմբագրել

Լեզվի իրականացման ընդլայնումներ(կիրառվում է GHC-ի համար).

  • տիպային համակարգի մշակում;
  • բազմահոսքային;
  • զուգահեռ հաշվարկներ;
  • բաշխված հաշվարկ

Օրինակներ

խմբագրել

Ֆակտորիալի հաշվարկ

խմբագրել

Հետևյալ օրինակը ցույց է տալիս Haskell-ի միջոցով ֆակտորիալը հաշվարկելու ֆունկցիան։

 fac :: Integer -> Integer
 fac 0 = 1
 fac n | n > 0 = n * fac (n - 1)

Այս սահմանումը նկարագրում է ֆակտորիալ հաշվարկման գործընթացը որպես ռեկուրսիվ ֆունկցիա : Այս սահմանումը նման է համակարգչային գիտության դասագրքերում առկա սահմանմանը։ Վերը նշված օրինակը կարող է վերաշարադրվել հետևյալ ձևով

fac n = product [1..n]

որը համապատասխանում է ֆակտորիայի մաթեմատիկական սահմանմանը։

Վերոնշյալ կոդի առաջին տողը պարտադիր չէ և որը համարվում է ֆունկցիոնալ տիպի հայտարարում, այսինքն՝ սահմանում է արգումենտի տեսակները (նշված վերջին « -> »-ից առաջ) և վերադարձի տեսակը (նշված է վերջին « -> »-ից հետո): Այս տողը կարելի է կարդալ հետևյալ կերպ. fac ֆունկցիան ունի ( :: ) տեսակ՝ ամբողջ թվից ամբողջ թիվ ( Integer -> Integer ): Սա նշանակում է, որ այն ստանում է մեկ ամբողջ թիվ որպես մուտքագրում (գրված է «->»-ի ձախ կողմում) և վերադարձնում է արդյունք, որը նույնպես ամբողջական տիպի է (գրված է «->»-ի աջ կողմում): Եթե ծրագրավորողը հստակորեն չի նշել տեսակները, ապա կոմպիլյատորը կամ թարգմանիչը կարող է ինքնաբերաբար որոշել դրանք:

Երկրորդ և երրորդ տողերը կազմում են ֆունկցիայի մարմնի սահմանումը: Սահմանումը բաղկացած է նախադասություններից: Յուրաքանչյուր նախադասություն նմուշ-արտահայտություն զույգ է: Կոմպիլյատորը կամ թարգմանիչը օգտագործում է նմուշների համապատասխանության մեխանիզմ՝ արտահայտություններից մեկն ընտրելու համար: Այս դեպքում սահմանման երկրորդ տողը կընտրվի, երբ 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 ֆունկցիայի միջոցով, ձախից աջ foldl մեկ բառով, օգտագործելով f ֆունկցիան, որը պահպանում է ընթերցված թվերի և միջանկյալ արժեքների աշխատանքային ցուցակը (առաջին [] - դատարկ ցուցակ) և յուրաքանչյուր մուտքային բառ մեկնաբանում է որպես թվաբանական ֆունկցիայի նշանակում կամ որպես թիվ, երբ գնահատում է արտահայտության վերջնական արժեքը ( որը կլինի աշխատանքային ցուցակում առաջին մնացած արժեքը՝ մուտքագրված արտահայտության բառացանկը մշակելուց հետո, որպեսզի այն հնարավոր լինի այնտեղից ստանալ՝ օգտագործելով head ստանդարտ գործառույթները):

Այստեղ (.) ֆունկցիաների կոմպոզիցիայի օպերատորն է, (f . g) x = f (gx) . Օրինակ՝

*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)]

կամ GHC կոմպիլյատորում ներդրված Haskell լեզվի ընդլայնում (զուգահեռ ցանկի սահմանիչներ,անգլ.՝ 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

կամ օգտագործելով Էրատոսթենեսի մաղը, իր նախատիպային, անարդյունավետ տարբերակով,

 primes = (map head . scanl minus [2..] . map (\p -> [p, p+p..])) primes

կամ արդյունավետ՝ կոմպոզիտային թվերի հոսքերի նախնական կասկադային համադրմամբ

 primes = 2 : _Y ((3:) . minus [5,7..] . unionAll . map (\p -> [p*p, p*p+2*p..]))
   where 
     _Y g = g (_Y g)
     unionAll ((x:xs):t) = x : union xs (unionAll (pairs t))
     pairs ((x:xs):ys:t) = (x : union xs ys) : pairs t

կամ հատված առ հատված, զանգվածներով,

import Data.Array
import Data.List (tails, inits)

ps = 2 : [n | (r:q:_, px) <- (zip . tails . (2:) . map (^2)) ps (inits ps),
              (n,True)    <- assocs (
                                accumArray (\_ _ -> False) True (r+1,q-1)
                     [(m,()) | p <- px, 
                               let s = div (r+p) p * p,  m <- [s,s+p..q-1]] )]

օգտագործելով կանոնական ֆունկցիաները minus, union [20] ):

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

Թվային ինտեգրում

խմբագրել

Թվային ինտեգրում   սեղանի մեթոդով:

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

Պալինդրոմի ստուգում

խմբագրել

Ստորև բերված օրինակը ցույց է տալիս,ինչպես աշխատել Unicode տողերի հետ:

import Data.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 "I prefer Pi"
    test "حوت فمه مفتوح"
    test "Ne mateno, bone tamen"

-- Вывод:
-- А в Енисее — синева: True
-- А роза упала на лапу Азора: True
-- Не роза упала на лапу Азора: False
-- Мир как Рим: True
-- Мир не Рим: False
-- I prefer Pi: True
-- حوت فمه مفتوح: True
-- Ne mateno, bone tamen: True

Հավելվածներ, գրված Haskell ծրագրավորման լեզվով

խմբագրել

Կոմերցիոն ծրագրեր

խմբագրել

Լեզուն որոշակի տարածում ձեռք է բերել առևտրային միջավայրում [21], ինչին, մասնավորապես, նպաստել է համայնքի ավանդույթը՝ արտոնագրերով գրադարաններ թողարկելու համար (ազատ հասանելի գրադարանների ավելի քան 70%-ը բաշխվում է BSD-ի, MIT-ի լիցենզիաների պայմաններով կամ գտնվում են հանրային սեփականություն):

Haskell-ում իրականացվող առևտրային նախագծերից են Bluespec SystemVerilog (կիսահաղորդչային սխեմաների նախագծման և ստուգման համար նախատեսված, Haskell լեզվի ընդլայնում) [22], Cryptol (գաղտնագրման ալգորիթմների մշակման և ստուգման լեզու, իրականացված Haskell ծրագրավորման լեզվով): Առաջին պաշտոնապես հաստատված seL4 միկրոմիջուկը գրվել է նաև Haskell–ի միջոցով:

Haskell-ը ակտիվորեն օգտագործվում է ֆինանսական ծրագրավորման, ռիսկերի վերլուծության և որոշումների աջակցման համակարգերի ոլորտում: Haskell-ը օգտագործվում է քաղաքի լանդշաֆտային գեներատորի մշակողների կողմից խաղերի և Gamr7 սիմուլյացիաների համար [23] : Առևտրային կազմակերպություններում (ներառյալ ԱՊՀ երկրներում) մասնավոր տեղեկատվական համակարգերի զարգացման համար ևս օգտագործվել է Haskell ծրագրավորման լեզուն [24] :

Բաց կոդով հավելվածներ

խմբագրել

Բաց կոդով գրադարանների և Haskell-ով գրված հավելվածների զգալի մասը հասանելի է Hackage-ի արխիվում: Դրանք ներառում են համընդհանուր նշագրման փոխարկիչ Pandoc, emacs-ի նմանվող տեքստային խմբագրիչ Yi և ինտեգրված զարգացման միջավայր Leksah : Համակարգի զարգացումներից են բաշխված տարբերակների կառավարման համակարգը Darcs-ը, House օպերացիոն համակարգը և խճանկարային պատուհանների կառավարիչ Xmonad-ը :

GHC կոմպիլյատորը հաճախ ծառայում է որպես փորձնական հարթակ՝ ֆունկցիոնալ ծրագրավորման և օպտիմալացման նոր հնարավորությունների փորձարկման համար: Միևնույն ժամանակ, Agda, Curry, լեզուների կազմողները, ինչպես նաև Perl 6 Pugs լեզվի առաջին կոմպիլյատորն ու թարգմանիչը (ստեղծվել է ընդամենը մեկ ամսում), գրվել են Haskell-ով։

Ծանոթագրություններ

խմբագրել
  1. http://news.yale.edu/2015/04/30/memoriam-paul-hudak-computer-scientist-and-saybrook-college-master
  2. http://softwareengineeringdaily.com/2015/11/05/haskell-with-lennart-augustsson/
  3. http://www.cse.chalmers.se/~rjmh/Software/h++.html
  4. 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 A history of Haskell:being lazy with classSIGPLAN, 2007.
  5. [Haskell Announcing Haskell 2010] — 2009.
  6. The Haskell 98 Language Report Արխիվացված 2010-03-08 Wayback Machine — получено 05.02.2010
  7. «Haskell Prime». Արխիվացված է օրիգինալից 2008-12-19-ին. Վերցված է 2010-02-05-ին.
  8. «Simon Marlow, Announcing Haskell 2010». Արխիվացված է օրիգինալից 2015-02-13-ին. Վերցված է 2009-12-26-ին.
  9. «The Haskell 98 Foreign Function Interface 1.0: An Addendum to the Haskell 98 Report». Արխիվացված է օրիգինալից 2004-10-10-ին. Վերցված է 2004-10-16-ին.
  10. «Реализации языка Haskell (англ.)». Արխիվացված է օրիգինալից 2010-03-17-ին. Վերցված է 2010-02-24-ին.
  11. «2017 state of Haskell survey results». taylor.fausak.me (անգլերեն). Արխիվացված է օրիգինալից 2018-11-08-ին. Վերցված է 2018-11-12-ին.
  12. The Glasgow Haskell Compiler. The Architecture of Open Source Applications, Volume 2 Archive copy Wayback Machine-ի միջոցով:, 2012(անգլերեն)
  13. «A history of Haskell: being lazy with class — SIGPLAN, 2007» (PDF). Արխիվացված է օրիգինալից (PDF) 2017-09-09-ին. Վերցված է 2017-09-09-ին. {{cite web}}: no-break space character in |title= at position 44 (օգնություն)
  14. «The Haskell Platform». Արխիվացված է օրիգինալից 2010-02-27-ին. Վերցված է 2010-02-24-ին.
  15. «Running Haskell on the CLR (using UHC)». Արխիվացված է օրիգինալից 2021-08-09-ին. Վերցված է 2010-02-24-ին.
  16. «1.5.1 Why isn't GHC available for .NET or on the JVM?». Արխիվացված է օրիգինալից 2010-03-29-ին. Վերցված է 2010-02-24-ին.
  17. «кодогенератор JavaScript для GHC». Արխիվացված է օրիգինալից 2010-03-13-ին. Վերցված է 2010-02-24-ին.
  18. «Yhc/Javascript, YCR2JS, a Converter of Yhc Core to Javascript». Արխիվացված է օրիգինալից 2010-06-03-ին. Վերցված է 2010-02-24-ին.
  19. «CλaSH — From Haskell to Hardware». Արխիվացված է օրիգինալից 2018-06-15-ին. Վերցված է 2018-06-16-ին. {{cite web}}: no-break space character in |title= at position 6 (օգնություն)
  20. Функции из модуля Data.List.Ordered Archive copy Wayback Machine-ի միջոցով:
  21. (անգլերեն)Коммерческие применения языка Haskell Archive copy Wayback Machine-ի միջոցով:
  22. «Bluespec». Արխիվացված է օրիգինալից 2010-02-06-ին. Վերցված է 2010-02-06-ին.
  23. «Gamr7: UrbanPAD. The Software for 3D city & buildings creation». Արխիվացված է օրիգինալից 2010-02-16-ին. Վերցված է 2010-02-18-ին.
  24. {{{վերնագիր}}}.

Գրականություն

խմբագրել
  • 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

Արտաքին հղումներ

խմբագրել