Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

Haskell


Логотип Haskell

План:


Введення

Hskell ( рус. Хаскеля, Хаскелл ) - Стандартизований чистий функціональний мова програмування загального призначення. Є одним з найпоширеніших мов програмування з підтримкою відкладених обчислень. Типізація в Хаскеля сувора, статична, з автоматичним висновком типів. Оскільки мова функціональний, то основна керуюча структура - це функція. Серйозне ставлення до типізації - ще одна відмінна риса Хаскеля. Концепція мови відображає ідею математика Хаскелл Каррі, який писав, що "доказ - це програма, а доводить формула - це тип програми" [1] [2]. Саме на честь Х. Каррі мова і отримав свою назву.

Сьогодні Хаскеля стала мовою швидкої розробки надійних, коротких і коректних програм. Є засоби взаємодії з кодом на інших мовах програмування. Є вбудована підтримка многозадачного і паралельного програмування, розвинений інструментарій (засоби автоматичного тестування, налагодження і профілювання, у тому числі для паралельних програм), існує багато бібліотек з відкритим вихідним кодом (більше 1800 пакетів в одному тільки архіві Hackage) [3].


1. Історія

Хаскеля належить до сімейства мов ML. Безпосередньо на нього справив великий вплив мову Miranda, розроблений в 1985 р. Девідом Тернером. Міранда була першим чистим функціональним мовою, що мав комерційну підтримку, і була відносно популярна в 1980-х роках, але залишалася невільним програмним забезпеченням. Це ускладнювало розвиток і дослідження можливостей ледачого функціонального програмування, тому буквально за пару років з'явилося більше десятка схожих мов. Щоб об'єднати зусилля різних розробників, в 1987 р. на конференції з функціональним мовам програмування та комп'ютерної архітектурі в Орегоні (FPCA'87) було вирішено створити комітет для розробки відкритого стандарту.

У 1990 р. була запропонована перша версія мови, Haskell 1.0. Надалі робота комітету продовжилася, і в 1999 р. був опублікований "The Haskell 98 Report [4] ", який став стабільним стандартом мови на багато років. Мова, однак, продовжував бурхливо розвиватися, компілятор GHC був фактичним стандартом щодо нових можливостей.

Наразі розробка нових версій мови йде відкрито, цей процес отримав назву Haskell ' [5] (Haskell Prime [hskəl praɪm], "Хаскеля-штрих"). Всі бажаючі можуть висувати свої пропозиції до обговорення, пропозиції обговорюються протягом року, комітет відбирає і оголошує пропозиції, які готовий прийняти, формується новий комітет і до кінця року готується нова версія мови. Таким чином, нові версії мови тепер можуть з'являтися щороку. Планується оголошувати деякі ревізії "значними" і підтримувати такі ревізії протягом тривалого часу.

Остання версія мови - Haskell 2010 - була оголошена в кінці 2009 р [6], але останньою "значною" версією (стандартом) залишається Haskell 98.


2. Характеристики мови

В якості основних характеристик мови Haskell можна виділити наступні:

З часу прийняття останнього стандарту мови (Haskell98) пройшло багато часу, і з тих пір провідні реалізації мови (ghc і hugs) були розширені безліччю додаткових можливостей:

  • Поліморфізм 2-го і вищих рангів (rank-2 and rank-N polymorphism)
  • Функціональні залежності (FD, functional dependencies)

3. Реалізації мови

Є кілька реалізацій мови Хаскеля [8]. Деякі реалізації орієнтовані на практичне застосування, в той час як інші - представляють насамперед академічний інтерес.

3.1. Компілятори та інтерпретатори

Найбільш популярний на практиці оптимізуючий компілятор 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

3.2. Haskell Platform

У 2009 році сформувалася концепція Haskell Platform [9] - стандартного дистрибутива мови, що включає крім компілятора (GHC), також додатковий інструментарій (систему побудови та розгортання пакетів Cabal) і набір популярних бібліотек.

Зараз Haskell Platform - це рекомендований базовий дистрибутив для розробників. Готові зборки Haskell Platform доступні для Windows, MacOS X і ряду дистрибутивів Linux.

3.3. Альтернативні цільові платформи

Більшість компіляторів Хаскеля створюють безпосередньо машинний код для використовуваної платформи, але є кілька проектів, що дозволяють компілювати Хаскеля в код для віртуальних машин або генерувати код на інших мовах програмування. Ступінь зрілості і рівень підтримки подібних проектів сильно різниться.

  • 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, але ці розробки поки ще експериментальні. Також існують реалізації підмножин мови на різних цільових платформах.


3.4. Розширення мови

Розширення реалізацій мови (відноситься до GHC):


4. Приклади

4.1. Обчислення факторіала

Наступний приклад показує синтаксис мови 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, то програма зупиниться з повідомленням про помилку.


4.2. Калькулятор

Найпростіший калькулятор для обчислення виразів у зворотної польської записи може бути визначений на мові 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 (gx). Наприклад,

 *  Main  >  calc  "1 2 3 + 4 * - ABS"  19.0 

4.3. Числа Фібоначчі

Інший приклад показує спосіб обчислення нескінченного списку чисел Фібоначчі за лінійний час:

 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  : Fibgen fibs  where  fibgen  (  a: t  @  (  b: z  )  )  =  (  a  +  b  )  : Fibgen t 

4.4. Прості числа

У цих прикладах показано, як можна використовувати спискові висловлювання (генератори списків). Реалізація знаходження всіх простих чисел звичайним шляхом ( перевірка кожного числа на простоту):

 - Загальне визначення (всі натуральні числа> 1, які є простими)  primeNums  =  2  :  [  n  |  n  <-  [  3  ..  ]  ,  isPrime n  ]  - Число просте, якщо у нього немає (простих) дільників  isPrime n  =  foldr  (  \ Pr  ->  p  *  p  >  n  | |  (  rem  np  / =  0  & &  r  )  )  True primeNums 

або по-сегментним перебором дільників,

 primesST  =  2  :  3  : Sieve  0  5  9  (  drop  2  primesST  )  where  sieve kxq 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  xy  of  LT  ->  x: union xs  (  y: ys  )  EQ  ->  x: union xs ys GT  ->  y: union  (  x: xs  )  ys union ab  =  a  + +  b minus  (  x: xs  )  (  y: ys  )  =  case  compare  xy  of  LT  ->  x: minus xs  (  y: ys  )  EQ  ->  minus xs ys GT  ->  minus  (  x: xs  )  ys minus ab  =  a 

4.5. Опис гральних карт

Простий приклад використання алгебраїчних типів даних для опису гральних карт. Ідентифікатори типів починаються з великих літер. Ідентифікатори змінних і функцій - з маленьких. Нові алгебраїчні типи визначаються ключовим словом 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 

4.6. Чисельне інтегрування

Чисельне інтегрування \ Int \ limits_0 ^ {2 \ pi} x \ sin x \, {\ rm d} x = -2 \ pi методом трапецій:

 trapezeIntegrate fabn  =  (  (  sum  $  map  f  [  a  +  h  ,  a  +  2  *  h  ..  b  -  h  ]  )  +  t  )  *  h  where  t  =  (  fa  +  fb  )  /  2  h  =  (  b  -  a  )  /  n main  =  do  print  $  trapezeIntegrate  (  \ X  ->  x  *  sin  x  )  0  (  2  *  pi  )  100  - Висновок: -6.281118086046067 

4.7. Перевірка паліндромів

Як видно, Хаскеля прекрасно працює з Юнікод.

 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 

5. Програми, написані на мові Haskell

Мозаїчний віконний менеджер Xmonad для X Window System цілком написаний на Хаскеля. Darcs - розподілена система керування версіями з рядом унікальних можливостей - написана на Хаскеля. Перша реалізація компілятора й інтерпретатора мови Perl 6, Pugs, була написана на Хаскеля за кілька місяців. Компілятор GHC часто виступає експериментальним майданчиком для перевірки нових можливостей функціонального програмування та оптимізації.

5.1. Пропрієтарні програми

Хаскеля все частіше використовується в комерційному середовищі [20]. Цьому сприяє і прийнята в співтоваристві традиція випускати бібліотеки під ліберальними ліцензіями (більше 70% вільно доступних бібліотек поширюються на умовах ліцензій BSD, MIT чи є суспільним надбанням).

Ось приклади деяких комерційних програм, написаних на Хаскеля: Bluespec SystemVerilog, мова проектування та верифікації напівпровідникових схем, є розширенням Хаскеля [21]. Cryptol, комерційний мова для розробки та перевірки криптографічних алгоритмів, реалізований на Хаскеля. Примітно, що перше формально верифіковані мікроядро seL4 було теж написано на Хаскеля.

Активно застосовується Хаскеля в області фінансового програмування, аналізу ризиків, в системах підтримки рішень. Хаскеля застосовують розробники генератора міських ландшафтів для ігор і моделювання Gamr7 [22]. Є приклади успішного застосування Хаскеля для розробки приватних інформаційних систем в комерційних організаціях, як у світі, так і в країнах СНД [23].


5.2. Програми з відкритим вихідним кодом

Також на Хаскеля написано багато програм c відкритим вихідним кодом. Більшість з них доступні в архіві Hackage. Ось деякі з них:

5.2.1. Бази даних

Більш повний список див Hackage: Databases

  • haskelldb - строго типізований інтерфейс доступу до SQL-баз даних
  • HDBC - універсальний інтерфейс доступу до реляційних баз даних (підтримуються SQLite, MySQL, PostgreSQL, ODBC)
  • Takusen - бібліотека доступу до баз даних, що використовує інтерфейс лівої згортки
  • є бібліотеки для роботи з BerkeleyDB, CouchDB, MongoDB, Redis, TokyoCabinet / TokyoTyrant, SimpleDB, SQLite

5.2.2. Графіка

Більш повний список див Hackage: Graphics.

  • Blobs - редактор діаграм
  • Diagrams - бібліотека для програмування схем і діаграм
  • FieldTrip - бібліотека для функціонального опису 3D-об'єктів
  • Glome - один з безлічі трасувальником променів на Хаскеля
  • GLUT і OpenGL - інтерфейси для використання GLUT і OpenGL з Хаскеля
  • GPipe - функціональний інтерфейс для програмування GPU
  • Grapefruit - бібліотека для функціонального реактивного програмування графіки та інтерфейсів
  • Haven - бібліотека відтворення масштабованої векторної графіки
  • HaskellCharts - бібліотека для відтворення двовимірних графіків
  • SDL - інтерфейс для використання libSDL з Хаскеля
  • Yampa - бібліотека для функціонального реактивного програмування за допомогою стрілок

5.2.3. Графічні інтерфейси

Більш повний список див Hackage: GUI.

  • Gtk2Hs - бібліотека для створення графічних інтерфейсів на основі GTK +
  • Grapefruit і wxFruit - бібліотеки декларативного програмування інтерфейсів (на основі реактивного програмування)
  • qtHaskell - бібліотека для створення графічних інтерфейсів на основі Qt
  • wxHaskell - бібліотека для створення графічних інтерфейсів на основі wxWidgets

5.2.4. Ігри

Більш повний список див Hackage: Games.

5.2.5. Інтернет

Більш повний список див Hackage: Network


5.2.6. Обробка тексту

Більш повний список див Hackage: Text

  • HaXml - багатофункціональна бібліотека для роботи з XML
  • HXT - комбінаторна бібліотека для роботи з XML, що використовує виразний предметно-орієнтована мова, заснований на стрілках
  • Leksah [1] - інтегроване середовище розробки (IDE), написана на Хаскеля і, в основному, для розробки на Хаскеля; підтримує навігацію по вихідним текстом, "розумне" автодоповнення, налагодження і складання пакетів.
  • Pandoc - універсальний конвертер тексту між різними мовами розмітки
  • Parsec - комбінаторна бібліотека для синтаксичного аналізу
  • The Grammatical Framework - бібліотека для роботи з текстом на природних мовах
  • Yi - подібний Emacs -у текстовий редактор, використовує Хаскеля також і в якості скриптової мови

5.2.7. Паралельне, многозадачное і багатопотокове програмування

  • CHP - Communicating Haskell Processes, бібліотека, що реалізує модель паралельних процесів без спільної пам'яті
  • Data Parallel Haskell - розширення мови, що забезпечують паралелізм даних на багатоядерних процесорах
  • parallel - стандартна бібліотека для паралельного програмування
  • STM - бібліотека реалізує Software Transactional Memory

5.2.8. Розробка

Більш повний список див Hackage: Development


5.2.9. Системні програми

Більш повний список див Hackage: System

  • Darcs - просунута розподілена система контролю версій
  • House - операційна система, написана на Хаскеля
  • Xmonad - популярний мозаїчний менеджер вікон
  • Himerge - графічна оболонка для Emerge-пакетного менеджера Gentoo
  • FreeArc - архіватор

5.2.10. Мови та компілятори

Більш повний список див 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. 584-590
  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 - haskell.org / - станом на 05.02.2010.
  4. The Haskell 98 Language Report - www.haskell.org/onlinereport/ - отримано 05.02.2010
  5. Haskell Prime - hackage.haskell.org / trac / haskell-prime /
  6. Simon Marlow, Announcing Haskell 2010 - www.haskell.org/pipermail/haskell/2009-November/021750.html
  7. The Haskell 98 Foreign Function Interface 1.0: An Addendum to the Haskell 98 Report - www.cse.unsw.edu.au/ ~ chak / haskell / ffi /
  8. Реалізації мови Хаскеля (англ.) - www.haskell.org / haskellwiki / Implementations
  9. The Haskell Platform - hackage.haskell.org / platform /
  10. Merge Request: LLVM Code Generator for GHC - www.haskell.org/pipermail/cvs-ghc/2010-February/052606.html
  11. The Glasgow Haskell Compiler and LLVM - blog.llvm.org/2010/05/glasgow-haskell-compiler-and-llvm.html
  12. Smoking fast Haskell code using GHC's new LLVM codegen - donsbot.wordpress.com/2010/02/21/smoking-fast-haskell-code-using-ghcs-new-llvm-codegen /
  13. LambdaVM - wiki.brianweb.net / LambdaVM / LambdaVM
  14. JVM-Bridge - semantic.org / jvm-bridge /
  15. The Jaskell Project Home Page - www.scdi.org/ ~ avernet / projects / jaskell /
  16. Running Haskell on the CLR (using UHC) - tom.lokhorst.eu / ehc / clr /
  17. 1.5.1 Why isn't GHC available for. NET or on the JVM? - www.haskell.org/haskellwiki/GHC:FAQ # Why_isn.27t_GHC_available_for_.NET_or_on_the_JVM.3F
  18. кодогенератор JavaScript для GHC - vir.mskhug.ru / (Недоступна посилання)
  19. Yhc / Javascript, YCR2JS, a Converter of Yhc Core to Javascript - haskell.org / haskellwiki / Yhc / Javascript
  20. (Англ.) Комерційні застосування мови Хаскеля - www.haskell.org / haskellwiki / Haskell_in_industry
  21. Bluespec - homepages.inf.ed.ac.uk / wadler / realworld / bluespec.html
  22. Gamr7: UrbanPAD. The Software for 3D city & buildings creation. - gamr7.com /
  23. Астапов Дмитро Використання Haskell за підтримки критично важливою для бізнесу інформаційної системи - fprog.ru/2009/issue2 / / / Практика функціонального програмування: Журнал. - 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.

Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Another Haskell Compiler
Glasgow Haskell Compiler
© Усі права захищені
написати до нас