some elements of functional porgamming languages
DESCRIPTION
TRANSCRIPT
Некоторые элементы функциональных языков
программирования
Александр Карпич
3-я конференция .NET разработчиков25 сентября 2011
Содержание
• Подходы к программированию
• λ-нотация
• Основные элементы ФП
• «Зачем это нужно?»
Императивное программирование
Императивное программирование
• Изменение состояния с помощью последовательности команд
• Состояния изменяются присваиванием
• Программа – последовательность инструкций по изменению состояния
Императивное программирование
начальное состояние
(входные данные)
конечное состояние
(результат)
Функциональное программировани
е
Функциональное программирование
• Нет состояний;
• Нет присваиваний;
• Нет последовательного выполнения команд;
• Подобия циклов с помощью рекурсии;
• Функции высших порядков.
Достоинства ФП
• Более ясная семантика;
• Большее соответствие математическим моделям;
• Бо1льшая свобода исполнения операций.
Достоинства ФП
• Выразительность и элегантность;
• Параметризация и модульность;
• Удобные способы представления бесконечных данных.
Недостатки ФП
• Ввод-вывод;
• Интерактивные программы;
• Относительно высокий порог вхождения.
λ -исчисление — основа ФП
• 1930-е г. – А. Чёрч разработал теорию λ-исчисления;
• 1958 г. – Дж. Маккарти изобрёл LISP;
• 1973 г. – Создан язык ML;
• 1985 г. – На основе ML создан Oсaml;
• 2002 г. – На основе OCaml создан F#
λ -нотация
Пишем
λx.F[x]
чтобы определить функцию от x, которая возвращает F[x]
Примеры
(λx.2x + 1) 3β-редукция:
(λx.2x + 1) 3 = 2∙3 + 1
δ-редукция:
2∙3 + 1 = 7
(λx y.x + y) 1
β-редукция:
(λx y.x + y) 1 = λy.1 + y
λx y.x + y = λx.(λy.x + y)
(λx.x x) (λx.x x) = (λx.x x) (λx.x x)
Получили невычислимое выражение.
(λx.1)(λx.x x) (λx.x x)
= (λy.y y) (λx.x x)
Основные элементы функциональных языков
программирования
• Type inference (вывод типов);
• Higher-order function (функция высшего порядка);
• Pattern matching (сопоставление с образцом);
Type inference
• Нет необходимости использовать явные декларации типов;
• Автоматический вывод типов;
• Модель типизации Хиндли-Милнера;
• Работает не всегда.
Higher-order function
Функция, принимающая или возвращающая функцию:
List.map (fun i -> i*i) [1; 2; 3; 4];; val it : int list = [1; 4; 9; 16]
Pattern matching
let xor x y =match x, y with
| true, true -> false| true, false -> true| false, true -> true| false, false -> false
;;val xor : bool -> bool -> bool
F# killer features:
• Мультипарадигменный язык с упором на функциональное программирование;
• Статическая типизация;
• Интероперабельность с .NET;
• Ленивые вычисления.
Начало работы с F#
• .fs – файл с исходным кодом;
• fsi.exe – REPL;
• fsc.exe;
• Mono.
Система типов F#
• Типы значений• System.byte, System.Int32, System.Char и т.д.
• Типы функций
• string -> string -> string
• Присвоение значений• let value = 15;;• let mutable value = 77;;
Некоторые встроенные типыF#
• Кортеж – экземпляр класса Tuple>let tuple = “first”, 15, 16.8;;val tuple : string * int * float = (“first”, 15,
16.8)
• Список – неизменяемый тип
>let lst = [1; 1; 2; 3; 5; 8; 13];;val lst : int lst = [1; 1; 2; 3; 5; 8; 13]>let abc = [1 .. 5];;val abc : int lst = [1, 2, 3, 4, 5]
Объекты и классы
type Book = val title : stringval author : stringval publishDate : DateTime
new (t, a, pd) = {title = tauthor = apublishDate = pd}
Объекты и классы
type Book = val title : stringval author : stringval publishDate : DateTime
new (t:string, a:string, pd) = //произвольный код
{ title = tauthor = apublishDate = pd }
//произвольный код
Объекты и классы
type Book = (title : string, author : string,) = member this.Title = titlemember this.Author = author
Методы
• Начинаются с ключевого слова member
• Модификаторы public, private, internal
• Нет модификатора protected
• Поддержка перегрузки методов
«Зачем это нужно?»
Зачем это нужно?
• Расширить кругозор;
• Повысить производительность;
• Понять суть;
• Быть в курсе.
Типичные задачи
• Обработка данных
• синтаксический разбор;• компиляторы;• Data Mining;
• Вычислительные задачи
• Параллельное программирование
ФП в реальных проектах
• Twitter, Facebook;
• AutoCAD;
• Emacs;
• Maxima;
• Ericsson
Проблемы ФП
Проблемы
• Библиотеки;
• Обучение;
• Популярность;
• Инструментальные средства.
Литература
SICP
Литература
An introduction to Functional Programming through Lambda Calculus
Литература
Foundations of F#
Литература
Expert F#
Литература
F# for Scientists