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

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

Embed Size (px)

DESCRIPTION

По материалам конференции .NET разработчиков - www.dotnetconf.ru

Citation preview

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

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

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

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

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

• 3 человека

• C#, Visual Studio

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

• ????

FAIL

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

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

• Common Lisp, Haskell

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

• ????

PROFIT

Проблемы ФП

Проблемы

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

• Обучение;

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

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

Литература

SICP

Литература

An introduction to Functional Programming through Lambda Calculus

Литература

Foundations of F#

Литература

Expert F#

Литература

F# for Scientists

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

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

@_ymn