210 likes | 405 Views
Функциональное программирование Доклад на семинаре по специальности Студент гр.4057/2 Олег Хабаров 18.10.10. Содержание. Введение Лямбда-исчисление как база парадигмы Основы функционального программирования Преимущества и недостатки Языки Lisp Haskell Erlang ML OCaml F# Ссылки
E N D
Функциональное программирование • Доклад на семинаре по специальности • Студент гр.4057/2 Олег Хабаров • 18.10.10
Содержание Введение • Лямбда-исчисление как база парадигмы • Основы функционального программирования • Преимущества и недостатки • Языки • Lisp • Haskell • Erlang • ML • OCaml • F# • Ссылки Заключение Хабаров О.В. 4057/2
Введение • Импертивное программирование как основная парадигма программирования • Описывает порядок действий (как получить результат?) • Декларативное программирование описывает свойства (каким должен быть результат?) • Функциональное программирование – противоположность императивному Хабаров О.В. 4057/2
Лямбда-исчисление • Формальная система для описания функций, их приложений и рекурсии • Термами являются(и только они) • переменные • абстракции(описание функции) • приложения(вызов функции) • Альфа-эквивалентность • Свободные переменные Хабаров О.В. 4057/2
Основы функционального программирования • Объекты вычисления - функции • Отсутствие хранения состояния программы в явном виде • Функции высших порядков • Чистые функции • Рекурсия • Подход к вычислению аргументов • Строгое • Отложенное(ленивое) • Оптимизация хвостовой рекурсии Хабаров О.В. 4057/2
Преимущества и недостатки • Преимущества • Повышение надёжности кода • Удобство тестирования • Лучшая оптимизация при компиляции • Автоматическая оптимизация на параллельные вычисления • Недостатки • Интенсивное использование динамической памяти • Отсутствие «синтаксического сахара» Хабаров О.В. 4057/2
Языки • Главная проблема «чистого языка» - побочные эффекты • Чистые реализации используют монады для взаимодействия с окружающим миром • Большинство языков поддерживают парадигму функционального программирования, но не ограничиваются ей Хабаров О.В. 4057/2
Языки(2) Хабаров О.В. 4057/2
Lisp • ФП - опорная парадигма • Главные диалекты – Common Lisp и Scheme • Допускается императивность • Steel Bank Common lisp – стандартизован ANSI, компилируемый. Показывает отличную производительность • Пример – вычисление факториала (defunfactorial (n) (if (<= n 1) 1 (* n (factorial (- n 1))))) Хабаров О.В. 4057/2
Haskell • Стандартизованный чистый язык ФП • Реализует отложенные вычисления • Монады позволяют использовать графику, ввод/вывод, … • Примерпростой функции • на С intfoo (int x){ return x * 10 + 4; } • на Haskell foo :: Int -> Int foo bar = bar * 10 + 4 Хабаров О.В. 4057/2
Haskell(2) • Использование OpenGL – рисование точек importGraphics.Rendering.OpenGL importGraphics.UI.GLUT myPoints::[(GLfloat,GLfloat,GLfloat)] myPoints = map(\k ->(sin(2*pi*k/12),cos(2*pi*k/12),0.0))[1..12] main = do (progname, _)<-getArgsAndInitialize createWindow"Hello World" displayCallback$= display mainLoop display = do clear [ColorBuffer] renderPrimitive Points $mapM_(\(x, y, z)-> vertex$Vertex3 x y z)myPoints flush Хабаров О.В. 4057/2
Erlang • Назначение – распределённые вычислительные системы • Текущая реализация интерпретируемая, хотя поддерживается компилятор • Куски кода могут заменяться в run-time • Старая и новая версия модуля могут использоваться одновременно • Пример – вычисление факториала -module(fact). -export([fac/1]). factorial(0) -> 1; factorial(N) -> N*factorial(N-1). Хабаров О.В. 4057/2
Erlang(2) • Виртуальная машина - узел, обладающей именем • Узлы на одной машине и на разных не имеют различий • Каждый процесс может создавать потоки на разных узлах • Отсутствие присваиваний облегчает параллельное программирование Хабаров О.В. 4057/2
ML • ML – meta language, • Не скрывает побочных эффектов • Строгие вычисления • Статическая типизация • Основные диалекты – Standart ML и Caml • Применения • финансовые системы • приложения peer-to-peer • иерархические базы данных Хабаров О.В. 4057/2
OCaml • Objective Caml – найболее используемая реализация диалекта Caml • Объединяет функциональное, императивное и объектно-ориентированное программирование • Совместимость типов объектов также определяется по сигнатуре методов • Quick sort let recqsort = function | [] -> [] | pivot :: rest -> let is_less x = x < pivot in let left, right = List.partitionis_less rest in qsort left @ [pivot] @ qsort right Хабаров О.В. 4057/2
Ocaml(2) • Пример объединения(С) structfoo { int type; #define TYPE_INT 1 #define TYPE_PAIR_OF_INTS 2 #define TYPE_STRING 3 union { inti; // If type == TYPE_INT int pair[2]; // If type == TYPE_PAIR_OF_INTS char *str; // If type == TYPE_STRING } u; }; • Пример объединения(OCaml) type foo = Nothing | Int of int | Pair of int * int | String of string;; Хабаров О.В. 4057/2
F# • F# - диалект ML от Microsoft • Интегрирован в MSVS 10 • Согласован с .NET • Функциональная часть поддерживает кортежи, структуры и списки • Императивная часть языка позволяет использовать конструкции for, while и массивы • Поддержка объектно-ориентированных конструкций Хабаров О.В. 4057/2
F#(2) Пример на создание окна open System open System.Windows.Forms let form = new Form(Visible=true, TopMost=true, Text="Welcome to F#") let label = let temp = new Label() let x = 3 + (4 * 5) temp.Text <- sprintf "x = %d" x temp form.Controls.Add(label) [<STAThread>] Application.Run(form) Хабаров О.В. 4057/2
Заключение • Развитие функциональных языков в производственной сфере • Модульность и функции высших порядков – ключ к успеху • Нет однозначного мнения насчёт ленивых вычислений Хабаров О.В. 4057/2
Ссылки • Functional Programming//Wikipedia.http://en.wikipedia.org/wiki/Functional_programming • Haskell//Wikipedia. http://ru.wikipedia.org/wiki/Haskell • Haskell OpenGL. http://www.haskell.org/haskellwiki/OpenGL • Erlang//Wikipedia. http://en.wikipedia.org/wiki/Erlang • F#//Wikipedia. http://en.wikipedia.org/wiki/F_Sharp_(programming_language) • Практика функционального программирования. – 2009-2010. http://fprog.ru Хабаров О.В. 4057/2