Обзор языка HASKELL. Основные идеи. Параллелизм в HASKELL Преподаватель:

advertisement
Обзор языка 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
𝜆 - исчисление
𝜆-исчисление – формальная система.
Вместо использования уравнений для
определения функции мы также можем
определять их «анонимно», через лямбдаабстракцию.
add x y = x + y
𝜆-абстракция:
add = \x y -> x+y
Инфиксные выражения
Пример использования инфиксного
выражения для конкатенации списков:
(++) :: [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 <= 1 = 1
| otherwise = par n1 (seq n2 (n1 + n2 + 1))
where n1 = nfib (n-1)
n2 = nfib (n-2)
main :: IO ()
main = do
(x:xs) <- getArgs
let num = read x :: Int
let res = nfib num
print res
Haskell VERSUS C++
--Haskell
SortQuick [] = []
SortQuick (x:xs) = SortQuick [y | y <- xs, y < x ] ++ [x] ++ SortQuick [y | y <- xs, 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 <= j)
{
int temp = a[i]; a[i++] = a[j]; a[j--] = temp;
}
}
while (i <= j);
if (l < j) quickSort (a, l, j);
if (i < r) quickSort (a, i, r);
}
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 <- getStdGen
print (last (q (randSeq n gen)))
selectSort ["1"] = qsort1
selectSort _ = List.sort
main :: IO ()
main = do (x:xs) <- getArgs
let listlen = read x :: Int
q = selectSort xs
testQsort q listlen
Haskell VERSUS C++
1.6
1.4
1.2
1
haskel
0.8
c++
0.6
0.4
0.2
0
10
11
12
13
14
15
16
17
18
Использованная литература и
ссылки
Литература
 «A Gentle Introduction To Haskell» Paul Hudak, John Peterson,
Joseph Fasel
 http://haskell.org/ghc/docs/6.6/html/users_guide/lang-parallel.html
 http://ru.wikibooks.org/wiki/Первые_шаги/компиляция_и_запуск
 http://en.literateprograms.org/Quicksort_(Haskell)
 http://eax.me/haskell-first-app/
 http://www.haskell.ru/lexemes.html
 Википедия
Ссылки:
 Полный перевод описания языка Haskell на русский язык
Вопросы?
Спасибо за внимание
Download