Обзор языка HASKELL. Основные идеи. Параллелизм в HASKELL Преподаватель: Мееров И.Б. Выполнили студенты: Панина К. Соломин С.
Язык программирования HASKELL Haskell - стандартизованный чистый функциональный язык программирования общего назначения. Поскольку язык функциональный, то основная управляющая структура - это функция. Сегодня в Haskell есть встроенная поддержка многозадачного и параллельного программирования, развитый инструментарий (средства автоматического тестирования, отладки и профилирования, в том числе для параллельных программ), существует много библиотек с открытым исходным кодом.
Немного истории… Haskell принадлежит к семейству языков ML. В 1990 г. была предложена первая версия языка, Haskell 1.0. В дальнейшем работа комитета продолжилась, и в 1999 г. был опубликован «The Haskell 98 Report», который стал стабильным стандартом языка на много лет. Сейчас разработка новых версий языка идёт открыто. Таким образом, новые версии языка теперь могут появляться каждый год. Последняя версия языка Haskell 2010 была объявлена в конце 2009 г, но последней «значительной» версией (стандартом) остаётся Haskell 98.
Зачем нужно функциональное программирование? Создатели языка Haskell очень гордятся тем, что в нём используется чистая функциональная парадигма. Они выделяют ряд положительных характеристик данного языка. проще писать сложные программы хорошая читабельность делается меньше ошибок И т. д. Кроме того, отмечается, что благодаря строгой типизации языка, в программах на Haskell не случается системных ошибок и не бывает аварийных ситуаций
Основные черты языка возможность использования лямбда-абстракции; функции высшего порядка; недопустимость побочных эффектов (чистота языка); ленивые вычисления (lazy evaluation); сопоставление с образцом, функциональные образцы (pattern matching); параметрический полиморфизм статическая типизация; алгебраические типы данных; рекурсивные типы данных; абстрактные типы данных (инкапсуляция); генераторы списков (list comprehensions); охраняющие выражения (guards); возможность интеграции с программами, реализованными на императивных языках программирования посредством открытых интерфейсов.
Значения, типы и прочие вкусности… Каждое значение имеет связанный с ним тип. Примеры выражений: 5 – атомарное значение a – атомарное значение [1,2,3] – структурированное значение ('b',4) – структурированное значение Выражения типа (типы): Integer - целые неограниченного диапазона Char- символы Integer->Integer - функции, отображающие Integer в Integer [Integer] - однородный список целых (Char,Integer) - пара из символа и целого.
Значения, типы и прочие вкусности… Описание типов: 5 :: Integer 'a' :: Char inc :: Integer -> Integer [1,2,3] :: [Integer] ('b',4) :: (Char, Integer)
Определяемые пользователем типы data Bool = False | True data Color = Red | Green | Blue | Indigo | Violet Типы также могут быть рекурсивными, как в случае типа двоичных деревьев: data Tree a = Leaf a | Branch (Tree a) (Tree a)
Функции в Haskell Функции в Haskell обычно определяются как набор уравнений. fac :: Integer -> Integer fac 0 = 1 fac n | n > 0 = n * fac (n - 1)
Функции в Haskell Суммирование двух чисел: add :: Integer -> Integer -> Integer add x y = x + y (add 5 7) Использование каррированных функций: inc :: Integer -> Integer inc = add 1 Но может оказаться так, что в качестве параметра будет необходимо передать в функцию другую функцию. Что же делать?? =(
Функции в Haskell Тогда к нам на помощь приходит функция map… =) map (add 1) [1,2,3] => [2,3,4]
Служебные слова и синтаксис Охрана и локальные переменные Если возникла необходимость определить какую-либо функцию с использованием механизма охраны, то для этой цели необходимо использовать символ вертикальной черты " | " : sign x | x > 0 = 1 | x == 0 = 0 | x < 0 = -1
Инфиксные выражения Пример использования инфиксного выражения для конкатенации списков: (++) :: [a] -> [a] -> [a] [] ++ ys = ys (x:xs) ++ ys = x : (xs++ys)
Операции ввода/вывода в Haskell Каждое действие ввода/вывода возвращает какое-то значение. getChar :: IO Char – IO – обёртка Char – возвращаемое значение putChar :: Char -> IO () () – ничего интересного не возвращает (то есть () – то же самое, что и void в C++)
Обработка исключений О, НЕТ! Что делать, если в процессе операций ввода/вывода возникла неординарная ситуация? Как и любой продвинутый язык программирования Haskell предлагает для этих целей механизм обработки исключений. Существует специальный тип IOError, который содержит описания всех возникаемых в процессе ввода/вывода ошибок. catch :: IO a -> (IOError -> IO a) -> IO a
Параллелизм в Haskell import Control.Parallel import System nfib :: Int -> Int nfib n | n
Haskell VERSUS C++ --Haskell SortQuick [] = [] SortQuick (x:xs) = SortQuick [y | y = x] //C++ void quickSort (int a[], int l, int r) { int i = l, j = r, x = a[(l + r) / 2]; do { while (a[i] < x) i++; while (x < a[j]) j--; if (i
Haskell VERSUS C++ module Main where import System import List( sort ) import Random qsort1 :: Ord a => [a] -> [a] qsort1 [] = [] qsort1 (p:xs) = qsort1 lesser ++ [p] ++ qsort1 greater where lesser = filter (< p) xs greater = filter (>= p) xs -- Testing randSeq n gen = take n (randomRs (0,n) gen) testQsort q n = do gen
Haskell VERSUS C++
Использованная литература и ссылки Литература «A Gentle Introduction To Haskell» Paul Hudak, John Peterson, Joseph Fasel Википедия Ссылки: Полный перевод описания языка Haskell на русский язык
Вопросы? Спасибо за внимание