Haskell

Haskell

Haskell
Логотип Haskell
Семантика:

функциональный

Тип исполнения:

интерпретируемый, компилируемый

Появился в:

1990 г.

Типизация данных:

статическая

Основные реализации:

HUGS, GHC, NHC, YHC

Диалекты:

O'Haskell
Haskell++
Mondrian

Испытал влияние:

Miranda, ML, Gofer

Háskell (русск. Ха́скелл) — функциональный язык программирования. Является одним из самых распространённых ленивых языков программирования. Имеет очень развитую систему типизации, однако система модулей разработана хуже. Последний стандарт языка, ставший стандартом функционального программирования — Haskell-98. Берёт своё начало из языка Miranda, который был разработан Дэвидом Тёрнером в качестве стандартного функционального языка. Назван по имени математика Хаскелла Карри.

Содержание

[править] Характеристики языка

В качестве основных характеристик языка Haskell можно выделить следующие:

Со времени принятия последнего стандарта языка (Haskell98) прошло много времени и с тех пор ведущие реализации языка (ghc и hugs) были расширены множеством дополнительных возможностей:

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

[править] Использование

Имеет интерпретаторы (один из самых известных — HUGS) и компиляторы (один из самых известных — Glasgow Haskell Compiler (GHC)).

Популярен в академических кругах, но малоизвестен среди прикладных программистов. В последнее время расширяется набор прикладных библиотек, язык интегрируется в распространённые программные системы (.Net [1], COM/ActiveX HaskellScript, Java jaskell), что делает язык всё более и более привлекательным для прикладных программистов.

Расширения языка:

Расширения реализаций языка (относится к 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 = foldl f [] . words
   where 
     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 xs y         = read y : xs

В данном определении функция левосторонней свёртки (foldl) вызывается с фактическими параметрами [] (пустой список — начальное значение для свёртки), f (функция для интерпретации одного слова во входном выражении) и списка, полученного разбивкой исходной строки с выражением на слова, то есть строки, отделённые друг от друга пробельными символами. В результате работы получается список, который содержит промежуточные и окончательное значения, получаемые при вычислении входного выражения.

Другой пример показывает способ вычисления бесконечного списка чисел Фибоначчи за линейное время:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Бесконечный список создаётся при помощи механизма корекурсии — последующие значения списка вычисляются на основе имеющихся с начальными 0 и 1 в качестве первых двух элементов списка. Это определение является примером применения механизма ленивых вычислений, который является важнейшей частью языка Haskell. Для понимания того, как это определение работает, можно рассмотреть вычисление первых шести чисел Фибоначчи при помощи этой функции:

fibs         = 0 : 1 : 1 : 2 : 3 : 5 : ...
               +   +   +   +   +   +
tail fibs    = 1 : 1 : 2 : 3 : 5 : ...
               =   =   =   =   =   =
zipWith ...  = 1 : 2 : 3 : 5 : 8 : ...
fibs = 0 : 1 : 1 : 2 : 3 : 5 : 8 : ...

Та же самая функция может быть записана короче и более понятно при использовании расширения языка Haskell, которое реализовано в компиляторе GHC (параллелизация определителей списков, Parallel List Comprehensions):

 fibs = 0 : 1 : [a + b | a <- fibs
                       | b <- tail fibs]

Реализация нахождения всех простых чисел обычным путём (проверка каждого числа на простоту)

 --the general alghoritm
 primes = [n | n <- [2..], isPrime n]
 --this function returns list of residue of division of correct number by all numbers in range [2..n/2]
 listOfRemainders n =[n `mod` x | x <- [2..(n `div` 2)]] 
 --function checks is reported number prime or not
 isPrime n = null (filter (==0) (listOfRemainders n))

а также с помощью решета Эратосфена:

 --Sieve of Eratosthenes
 ero = eroPrimes [2..]
 eroPrimes (x : xs) = x : eroPrimes [y | y <- xs , y `mod` x /= 0]

И получение, вообще говоря, бесконечного списка простых чисел:

 listOfPrimes = [n | n <- [2..], and [n `mod` (n-x) /= 0 | x <- [1..n-2] ] ]

[править] См. также

[править] Приложения, написанные на языке Haskell

[править] Ссылки

[править] Литература

  • 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. — М.: ДМК Пресс, 2006. С. 608. ISBN 5-94074-335-8
  • Graham Hutton. «Programming in Haskell». Cambrige University Press. ISBN 978-0-521-87172-3. ISBN 978-0-521-69269-4
  • Kees Doets, Jan van Eijck. «The Haskell Road to Logic, Maths and Programming». ISBN 0-9543006-9-6.


Источник — «Haskell»

<< назад   вперед >>

Look at other dictionaries:

  • Haskell — … (Большой англо-русский и русско-английский словарь)
  • Haskell — may refer to: Haskell (programmig laguage), a stadardized pure fuctioal programmig laguage with o-strict sematics Haskell Idia Natios Uiversity, a four year degree gratig uiversity i Lawrece, Kasas which offers free… (Wikipedia)
  • Haskell (programming language) — Ifobox programmig laguage ame Haskell paradigm fuctioal, o-strict, modular year 1990 desiger Simo Peyto-Joes, Paul Hudak [ [http://www.cs.yale.edu/homes/hudak-paul/ Professor Paul Hudak's Home Page ] ] , Philip Wadler, et al.…
  • Haskell Curry — Ifobox Scietist ame Haskell Brooks Curry birth_date September 12, 1900 birth_place Millis, Massachusetts death_date September 1, 1982 death_place State College, Pesylvaia residece citizeship USA atioality ethicity field mathematics…
  • Haskell County, Texas — Ifobox U.S. Couty couty Haskell Couty state Texas map size 250 fouded 1858 seat Haskell area_total_sq_mi 910 area_lad_sq_mi 903 area_water_sq_mi 7 area percetage 0.80% cesus yr 2000 pop 6093 desity_km2 3 web www.co.haskell.tx.us…
  • Haskell County, Oklahoma — Ifobox U.S. Couty couty Haskell Couty state Oklahoma fouded year fouded date seat wl Stigler largest city wl area_total_sq_mi 625 area_total_km2 1619 area_lad_sq_mi 577 area_lad_km2 1494 area_water_sq_mi 48 area_water_km2 125 area…
  • Haskell County, Kansas — Ifobox U.S. Couty couty Haskell Couty state Kasas fouded March 23, 1887 seat wl Sublette area_total_km2 1496 area_total_sq_mi 578 area_lad_km2 1495 area_lad_sq_mi 577 area_water_km2 1 area_water_sq_mi 0 area percetage 0.06% cesus…
  • Haskell, Arkansas — Ifobox Settlemet official_ame Haskell, Arkasas settlemet_type City imagesize image_captio image_ imagesize image_captio image_ mapsize 250px map_captio Locatio i Salie Couty ad the state of Arkasas mapsize1 map_captio1…
  • Haskell, Oklahoma — Ifobox Settlemet official_ame Haskell, Oklahoma settlemet_type Tow ickame motto imagesize image_captio image_ mapsize 250px map_captio Locatio of Haskell, Oklahoma mapsize1 map_captio1 subdivisio_type Coutry subdivisio_ame Uited…
  • Haskell, Texas — Ifobox Settlemet official_ame Haskell, Texas settlemet_type City ickame motto imagesize image_captio image_ mapsize 250px map_captio Locatio of Haskell, Texas mapsize1 250px map_captio1 subdivisio_type Coutry subdivisio_ame Uited…
  • Haskell Free Library and Opera House — Ifobox_rhp ame Haskell Free Library ad Opera House captio locator_x 232 locator_y 29 captio locatio Stastead, Quebec USA lat_degrees 45 lat_miutes 0 lat_secods 20.81 lat_directio N log_degrees 72 log_miutes 5 log_secods 51.70…