Haskell

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; генерирует промежуточный байт-код, который можно использовать для генерации кода на других языках программирования
  • UHC (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 (вероятно заброшен)
    • альтернативный кодогенератор в UHC (работоспособен почти полностью)
  • 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 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 "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, ниже приведены некоторые из них.

Базы данных
  • haskelldb — строго типизированный интерфейс доступа к SQL-базам данных;
  • HDBC — универсальный интерфейс доступа к реляционным базам данных (поддерживаются SQLite, MySQL, PostgreSQL, ODBC);
  • Takusen — библиотека доступа к базам данных, использующая интерфейс левой свёртки;
  • есть библиотеки для работы с BerkeleyDB, CouchDB, MongoDB, Redis, TokyoCabinet и TokyoTyrant, SimpleDB, SQLite;
Графика
  • Blobs — редактор диаграмм;
  • Diagrams — библиотека для программирования схем и диаграмм;
  • FieldTrip — библиотека для функционального описания 3D-объектов;
  • Glome — один из множества трассировщиков лучей;
  • GLUT и OpenGL — интерфейсы для использования GLUT и OpenGL;
  • GPipe — функциональный интерфейс для программирования GPU;
  • Grapefruit — библиотека для функционального реактивного программирования графики и интерфейсов;
  • Haven — библиотека отрисовки масштабируемой векторной графики;
  • HaskellCharts — библиотека для отрисовки двумерных графиков;
  • SDL — интерфейс для использования libSDL из Хаскеля;
  • Yampa — библиотека для функционального реактивного программирования с помощью стрелок;
Графические интерфейсы
  • Gtk2Hs — библиотека для создания графических интерфейсов на основе GTK+;
  • Grapefruit и wxFruit — библиотеки декларативного программирования интерфейсов (на основе реактивного программирования);
  • qtHaskell — библиотека для создания графических интерфейсов на основе Qt;
  • wxHaskell — библиотека для создания графических интерфейсов на основе wxWidgets;
Игры
  • bloxorz — трёхмерная логическая игра;
  • Frag — трёхмерный шутер от первого лица;
  • monadius — двумерный скроллер;
  • Raincat — рисованная игра-головоломка;
Интернет
  • gitit — вики-платформа, основанная на системах контроля версиями (darcs, git или mercurial);
  • happstack — фреймворк для веб-программирования (аналог Django или Ruby on Rails);
  • Twidge — терминальный клиент для микроблоггинга;
Обработка текста
  • HaXml — многофункциональная библиотека для работы с XML;
  • HXT — комбинаторная библиотека для работы с XML, использующая выразительный предметно-ориентированный язык, основанный на стрелках (англ. arrows);
  • Leksah (англ.) — интегрированная среда разработки, написанная на Хаскеле и, в основном, для разработки на Хаскеле; поддерживает навигацию по исходным текстом, автодополнение, отладку и сборку пакетов;
  • Pandoc — универсальный конвертер текста между различными языками разметки;
  • Parsec — комбинаторная библиотека для синтаксического анализа
  • The Grammatical Framework — библиотека для работы с текстом на естественных языках;
  • Yi — текстовый редактор подобный Emacs, написанный на Хаскеле и использующий его в качестве скриптового языка;
Параллельное, многозадачное и многопоточное программирование
  • CHP — Communicating Haskell Processes, библиотека, реализующая модель параллельных процессов без общей памяти;
  • Data Parallel Haskell — расширение языка, обеспечивающие параллелизм данных на многоядерных процессорах;
  • parallel — стандартная библиотека для параллельного программирования;
  • STM — реализация программной транзакционной памяти.
Разработка
Системные программы
  • Darcs — продвинутая распределённая система контроля версий;
  • House — операционная система, написанная на Хаскеле;
  • Xmonad — мозаичный менеджер окон;
  • Himerge — графическая оболочка для Emerge — пакетного менеджера Gentoo;
  • FreeArc — архиватор;
Языки и компиляторы
  • 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, сс. 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 — по состоянию на 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

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Haskell" в других словарях:

  • Haskell — Información general Paradigma Funcional, no estricto, modular, fuertemente tipificado Apareció en 1990 Diseñado por Universidad de Yale, Universidad de Glasgow …   Wikipedia Español

  • Haskell — Auteur le comité Haskell Développeurs la communauté Haskell …   Wikipédia en Français

  • Haskell — may refer to:*Haskell (programming language), a standardized pure functional programming language with non strict semantics * Haskell Indian Nations University, a four year degree granting university in Lawrence, Kansas which offers free tuition… …   Wikipedia

  • Haskell — ist der Familienname folgender Personen: Charles Haskell (1860–1933), US amerikanischer Politiker Colleen Haskell, US amerikanische Jung Schauspielerin Dudley C. Haskell (1843–1883), US amerikanischer Politiker Floyd K. Haskell (1916–1998), US… …   Deutsch Wikipedia

  • Haskell — es un lenguaje de programación funcional e interpretado que obtuvo su nombre del lógico Haskell Curry. Fue creado por un comité en los años 1980 con el objetivo específico de definir dicho lenguaje. El lenguaje evoluciona rápidamente con y (ver… …   Enciclopedia Universal

  • Haskell — Haskell, AR U.S. city in Arkansas Population (2000): 2645 Housing Units (2000): 762 Land area (2000): 4.621199 sq. miles (11.968849 sq. km) Water area (2000): 0.022774 sq. miles (0.058985 sq. km) Total area (2000): 4.643973 sq. miles (12.027834… …   StarDict's U.S. Gazetteer Places

  • Haskell, AR — U.S. city in Arkansas Population (2000): 2645 Housing Units (2000): 762 Land area (2000): 4.621199 sq. miles (11.968849 sq. km) Water area (2000): 0.022774 sq. miles (0.058985 sq. km) Total area (2000): 4.643973 sq. miles (12.027834 sq. km) FIPS… …   StarDict's U.S. Gazetteer Places

  • Haskell, OK — U.S. town in Oklahoma Population (2000): 1765 Housing Units (2000): 763 Land area (2000): 2.173356 sq. miles (5.628965 sq. km) Water area (2000): 0.000000 sq. miles (0.000000 sq. km) Total area (2000): 2.173356 sq. miles (5.628965 sq. km) FIPS… …   StarDict's U.S. Gazetteer Places

  • Haskell, TX — U.S. city in Texas Population (2000): 3106 Housing Units (2000): 1526 Land area (2000): 3.402575 sq. miles (8.812629 sq. km) Water area (2000): 0.000000 sq. miles (0.000000 sq. km) Total area (2000): 3.402575 sq. miles (8.812629 sq. km) FIPS code …   StarDict's U.S. Gazetteer Places

  • Haskell — ● np. m. ►LANG langage fonctionnel (voir aussi langage fonctionnel) polymorphe et typé (paresseux, en plus!), devant son nom à Haskell Brooks Curry (voir Curry, Haskell), mathématicien dont le travail a permis de jeter les bases de la… …   Dictionnaire d'informatique francophone


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»