Top Banner
Некоторые элементы функциональных языков программирования Александр Карпич 3-я конференция .NET разработчиков 25 сентября 2011
43

Некоторые элементы функциональных языков программирования

Dec 23, 2014

Download

Documents

По материалам конференции .NET разработчиков - www.dotnetconf.ru
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Некоторые элементы функциональных языков программирования

Некоторые элементы функциональных языков

программирования

Александр Карпич

3-я конференция .NET разработчиков25 сентября 2011

Page 2: Некоторые элементы функциональных языков программирования

Содержание

• Подходы к программированию

• λ-нотация

• Основные элементы ФП

• «Зачем это нужно?»

Page 3: Некоторые элементы функциональных языков программирования

Императивное программирование

Page 4: Некоторые элементы функциональных языков программирования

Императивное программирование

• Изменение состояния с помощью последовательности команд

• Состояния изменяются присваиванием

• Программа – последовательность инструкций по изменению состояния

Page 5: Некоторые элементы функциональных языков программирования

Императивное программирование

начальное состояние

(входные данные)

конечное состояние

(результат)

Page 6: Некоторые элементы функциональных языков программирования

Функциональное программировани

е

Page 7: Некоторые элементы функциональных языков программирования

Функциональное программирование

• Нет состояний;

• Нет присваиваний;

• Нет последовательного выполнения команд;

• Подобия циклов с помощью рекурсии;

• Функции высших порядков.

Page 8: Некоторые элементы функциональных языков программирования

Достоинства ФП

• Более ясная семантика;

• Большее соответствие математическим моделям;

• Бо1льшая свобода исполнения операций.

Page 9: Некоторые элементы функциональных языков программирования

Достоинства ФП

• Выразительность и элегантность;

• Параметризация и модульность;

• Удобные способы представления бесконечных данных.

Page 10: Некоторые элементы функциональных языков программирования

Недостатки ФП

• Ввод-вывод;

• Интерактивные программы;

• Относительно высокий порог вхождения.

Page 11: Некоторые элементы функциональных языков программирования

λ -исчисление — основа ФП

• 1930-е г. – А. Чёрч разработал теорию λ-исчисления;

• 1958 г. – Дж. Маккарти изобрёл LISP;

• 1973 г. – Создан язык ML;

• 1985 г. – На основе ML создан Oсaml;

• 2002 г. – На основе OCaml создан F#

Page 12: Некоторые элементы функциональных языков программирования

λ -нотация

Пишем

λx.F[x]

чтобы определить функцию от x, которая возвращает F[x]

Page 13: Некоторые элементы функциональных языков программирования

Примеры

(λx.2x + 1) 3β-редукция:

(λx.2x + 1) 3 = 2∙3 + 1

δ-редукция:

2∙3 + 1 = 7

Page 14: Некоторые элементы функциональных языков программирования

(λx y.x + y) 1

β-редукция:

(λx y.x + y) 1 = λy.1 + y

Page 15: Некоторые элементы функциональных языков программирования

λx y.x + y = λx.(λy.x + y)

Page 16: Некоторые элементы функциональных языков программирования

(λ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)

Page 17: Некоторые элементы функциональных языков программирования

Основные элементы функциональных языков

программирования

• Type inference (вывод типов);

• Higher-order function (функция высшего порядка);

• Pattern matching (сопоставление с образцом);

Page 18: Некоторые элементы функциональных языков программирования

Type inference

• Нет необходимости использовать явные декларации типов;

• Автоматический вывод типов;

• Модель типизации Хиндли-Милнера;

• Работает не всегда.

Page 19: Некоторые элементы функциональных языков программирования

Higher-order function

Функция, принимающая или возвращающая функцию:

List.map (fun i -> i*i) [1; 2; 3; 4];; val it : int list = [1; 4; 9; 16]

Page 20: Некоторые элементы функциональных языков программирования

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

Page 21: Некоторые элементы функциональных языков программирования

F# killer features:

• Мультипарадигменный язык с упором на функциональное программирование;

• Статическая типизация;

• Интероперабельность с .NET;

• Ленивые вычисления.

Page 22: Некоторые элементы функциональных языков программирования

Начало работы с F#

• .fs – файл с исходным кодом;

• fsi.exe – REPL;

• fsc.exe;

• Mono.

Page 23: Некоторые элементы функциональных языков программирования

Система типов F#

• Типы значений• System.byte, System.Int32, System.Char и т.д.

• Типы функций

• string -> string -> string

• Присвоение значений• let value = 15;;• let mutable value = 77;;

Page 24: Некоторые элементы функциональных языков программирования

Некоторые встроенные типы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]

Page 25: Некоторые элементы функциональных языков программирования

Объекты и классы

type Book = val title : stringval author : stringval publishDate : DateTime

new (t, a, pd) = {title = tauthor = apublishDate = pd}

Page 26: Некоторые элементы функциональных языков программирования

Объекты и классы

type Book = val title : stringval author : stringval publishDate : DateTime

new (t:string, a:string, pd) = //произвольный код

{ title = tauthor = apublishDate = pd }

//произвольный код

Page 27: Некоторые элементы функциональных языков программирования

Объекты и классы

type Book = (title : string, author : string,) = member this.Title = titlemember this.Author = author

Page 28: Некоторые элементы функциональных языков программирования

Методы

• Начинаются с ключевого слова member

• Модификаторы public, private, internal

• Нет модификатора protected

• Поддержка перегрузки методов

Page 29: Некоторые элементы функциональных языков программирования

«Зачем это нужно?»

Page 30: Некоторые элементы функциональных языков программирования

Зачем это нужно?

• Расширить кругозор;

• Повысить производительность;

• Понять суть;

• Быть в курсе.

Page 31: Некоторые элементы функциональных языков программирования

Типичные задачи

• Обработка данных

• синтаксический разбор;• компиляторы;• Data Mining;

• Вычислительные задачи

• Параллельное программирование

Page 32: Некоторые элементы функциональных языков программирования

ФП в реальных проектах

• Twitter, Facebook;

• AutoCAD;

• Emacs;

• Maxima;

• Ericsson

Page 33: Некоторые элементы функциональных языков программирования

Автоматическая генерация VHDL

• 3 человека

• C#, Visual Studio

• ~ 13 000 строк кода

• ????

FAIL

Page 34: Некоторые элементы функциональных языков программирования

Этапы трансляции

Page 35: Некоторые элементы функциональных языков программирования

Автоматическая генерация VHDL

• Common Lisp, Haskell

• ~ 4000 строк кода

• ????

PROFIT

Page 36: Некоторые элементы функциональных языков программирования

Проблемы ФП

Page 37: Некоторые элементы функциональных языков программирования

Проблемы

• Библиотеки;

• Обучение;

• Популярность;

• Инструментальные средства.

Page 38: Некоторые элементы функциональных языков программирования

Литература

SICP

Page 39: Некоторые элементы функциональных языков программирования

Литература

An introduction to Functional Programming through Lambda Calculus

Page 40: Некоторые элементы функциональных языков программирования

Литература

Foundations of F#

Page 41: Некоторые элементы функциональных языков программирования

Литература

Expert F#

Page 42: Некоторые элементы функциональных языков программирования

Литература

F# for Scientists

Page 43: Некоторые элементы функциональных языков программирования

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

Александр Карпич[email protected]

@_ymn