Обзор языка HASKELL. Основные идеи. Параллелизм в HASKELL Преподаватель: Мееров И.Б. Выполнили студенты: Панина К. Соломин С.

Презентация:



Advertisements
Похожие презентации
Язык функционального программирования Haskell Выполнила: Шатохина Е.В. ПИБ-41.
Advertisements

1 Кубенский А.А. Функциональное программирование. Глава 1. Элементы функционального программирования Введение в язык Haskell История языка Haskell.
Сошников Дмитрий Валерьевич к.ф.-м.н., доцент Факультет инноваций и высоких технологий Московский физико-технический институт.
1 Д.з. 1+1/(1+1/(1+…)) f n = 1+1/(1+1/(1+…)) f (n-1) f 0 = 1 f n = 1 + 1/f (n-1) 2 φ = 1.618…
1 Д.з. Shape – типичные ошибки contains (Circle r x y) a b = if (sqrt ((x-a)^2+(y-b)^2)) Double contains:: a -> Double -> Double -> Bool instance Shape.
Язык Haskell Обзор Eugeny L Yakimovitch
1 Д.з. 2 maxlist Не совсем правильное решение maxlist [x] = x maxlist (x:xs) = if x > maxlist xs then x else maxlist xs maxlist [1..100] – очень долго.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
1 Кубенский А.А. Функциональное программирование. Глава 2. Средства функционального программирования. Потоки. «Завязывание узлов» Часто обработку данных.
Функциональное программирование Язык программирования F#.NET.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
1 Кубенский А.А. Функциональное программирование. Глава 2. Средства функционального программирования Ленивые вычисления Рассмотрим выражение, содержащее.
1 Эффективность рекурсивных функций. Кубенский А.А. Функциональное программирование. Глава 1. Элементы функционального программирования. -- Вычисление.
Докладчики : Докшин П. А Шитро А. О 1. Язык быстрой разработки надёжных, кратких и корректных программ Non- strict ( ленивый язык ) Чисто функциональный.
1 Кубенский А.А. Функциональное программирование. Глава 4. Основы лямбда-исчисления Рекурсия в лямбда-исчислении fac = λn.(if (= n 0) 1 (* n (fac.
1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Глава 5. Системы исполнения функциональных программ.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
Функциональное программирование Доклад на семинаре по специальности Студент гр.4057/2 Олег Хабаров
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Транксрипт:

Обзор языка 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 на русский язык

Вопросы? Спасибо за внимание