1 / 21

Функциональное программирование Доклад на семинаре по специальности Студент гр.4057/2 Олег Хабаров

Функциональное программирование Доклад на семинаре по специальности Студент гр.4057/2 Олег Хабаров 18.10.10. Содержание. Введение Лямбда-исчисление как база парадигмы Основы функционального программирования Преимущества и недостатки Языки Lisp Haskell Erlang ML OCaml F# Ссылки

nixie
Download Presentation

Функциональное программирование Доклад на семинаре по специальности Студент гр.4057/2 Олег Хабаров

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Функциональное программирование • Доклад на семинаре по специальности • Студент гр.4057/2 Олег Хабаров • 18.10.10

  2. Содержание Введение • Лямбда-исчисление как база парадигмы • Основы функционального программирования • Преимущества и недостатки • Языки • Lisp • Haskell • Erlang • ML • OCaml • F# • Ссылки Заключение Хабаров О.В. 4057/2

  3. Введение • Импертивное программирование как основная парадигма программирования • Описывает порядок действий (как получить результат?) • Декларативное программирование описывает свойства (каким должен быть результат?) • Функциональное программирование – противоположность императивному Хабаров О.В. 4057/2

  4. Лямбда-исчисление • Формальная система для описания функций, их приложений и рекурсии • Термами являются(и только они) • переменные • абстракции(описание функции) • приложения(вызов функции) • Альфа-эквивалентность • Свободные переменные Хабаров О.В. 4057/2

  5. Основы функционального программирования • Объекты вычисления - функции • Отсутствие хранения состояния программы в явном виде • Функции высших порядков • Чистые функции • Рекурсия • Подход к вычислению аргументов • Строгое • Отложенное(ленивое) • Оптимизация хвостовой рекурсии Хабаров О.В. 4057/2

  6. Преимущества и недостатки • Преимущества • Повышение надёжности кода • Удобство тестирования • Лучшая оптимизация при компиляции • Автоматическая оптимизация на параллельные вычисления • Недостатки • Интенсивное использование динамической памяти • Отсутствие «синтаксического сахара» Хабаров О.В. 4057/2

  7. Языки • Главная проблема «чистого языка» - побочные эффекты • Чистые реализации используют монады для взаимодействия с окружающим миром • Большинство языков поддерживают парадигму функционального программирования, но не ограничиваются ей Хабаров О.В. 4057/2

  8. Языки(2) Хабаров О.В. 4057/2

  9. Lisp • ФП - опорная парадигма • Главные диалекты – Common Lisp и Scheme • Допускается императивность • Steel Bank Common lisp – стандартизован ANSI, компилируемый. Показывает отличную производительность • Пример – вычисление факториала (defunfactorial (n) (if (<= n 1) 1 (* n (factorial (- n 1))))) Хабаров О.В. 4057/2

  10. Haskell • Стандартизованный чистый язык ФП • Реализует отложенные вычисления • Монады позволяют использовать графику, ввод/вывод, … • Примерпростой функции • на С intfoo (int x){ return x * 10 + 4; } • на Haskell foo :: Int -> Int foo bar = bar * 10 + 4 Хабаров О.В. 4057/2

  11. 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

  12. Erlang • Назначение – распределённые вычислительные системы • Текущая реализация интерпретируемая, хотя поддерживается компилятор • Куски кода могут заменяться в run-time • Старая и новая версия модуля могут использоваться одновременно • Пример – вычисление факториала -module(fact). -export([fac/1]). factorial(0) -> 1; factorial(N) -> N*factorial(N-1). Хабаров О.В. 4057/2

  13. Erlang(2) • Виртуальная машина - узел, обладающей именем • Узлы на одной машине и на разных не имеют различий • Каждый процесс может создавать потоки на разных узлах • Отсутствие присваиваний облегчает параллельное программирование Хабаров О.В. 4057/2

  14. ML • ML – meta language, • Не скрывает побочных эффектов • Строгие вычисления • Статическая типизация • Основные диалекты – Standart ML и Caml • Применения • финансовые системы • приложения peer-to-peer • иерархические базы данных Хабаров О.В. 4057/2

  15. 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

  16. 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

  17. F# • F# - диалект ML от Microsoft • Интегрирован в MSVS 10 • Согласован с .NET • Функциональная часть поддерживает кортежи, структуры и списки • Императивная часть языка позволяет использовать конструкции for, while и массивы • Поддержка объектно-ориентированных конструкций Хабаров О.В. 4057/2

  18. 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

  19. Заключение • Развитие функциональных языков в производственной сфере • Модульность и функции высших порядков – ключ к успеху • Нет однозначного мнения насчёт ленивых вычислений Хабаров О.В. 4057/2

  20. Ссылки • 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

  21. Спасибо за внимание!

More Related