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


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

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

• Подходы к программированию
• λ-нотация
• Основные элементы ФП
• «Зачем это нужно?»
Императивное
программирование
Императивное
       программирование

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




начальное состояние   конечное состояние
  (входные данные)        (результат)
Функциональное
программирование
Функциональное
       программирование

• Нет состояний;
• Нет присваиваний;
• Нет последовательного выполнения команд;
• Подобия циклов с помощью рекурсии;
• Функции высших порядков.
Достоинства ФП

• Более ясная семантика;
• Большее соответствие математическим
  моделям;
•   льшая свобода исполнения операций.
Достоинства ФП

• Выразительность и элегантность;
• Параметризация и модульность;
• Удобные способы представления
  бесконечных данных.
Недостатки ФП
• Ввод-вывод;
• Интерактивные программы;
• Относительно высокий порог вхождения.
λ -исчисление — основа ФП
• 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) = (λy.y y) (λx.x x)
          = (λx.x x) (λx.x x)
Получили невычислимое выражение.

       (λx.1)(λx.x x) (λ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 : string
     val author : string
     val publishDate : DateTime
new (t, a, pd) = {
     title = t
     author = a
     publishDate = pd}
Объекты и классы
type Book =
      val title : string
      val author : string
      val publishDate : DateTime
new (t:string, a:string, pd) =
//произвольный код
       { title = t
       author = a
       publishDate = pd }
//произвольный код
Объекты и классы

type Book = (title : string,
         author : string,) =
member this.Title = title
member 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
Спасибо за внимание

    Александр Карпич
   avkarpich@gmail.com
          @_ymn

Some Elements of Functional Porgamming Languages

  • 1.
    3-я конференция .NETразработчиков 25 сентября 2011 Некоторые элементы функциональных языков программирования Александр Карпич
  • 2.
    Содержание • Подходы кпрограммированию • λ-нотация • Основные элементы ФП • «Зачем это нужно?»
  • 3.
  • 4.
    Императивное программирование • Изменение состояния с помощью последовательности команд • Состояния изменяются присваиванием • Программа – последовательность инструкций по изменению состояния
  • 5.
    Императивное программирование начальное состояние конечное состояние (входные данные) (результат)
  • 6.
  • 7.
    Функциональное программирование • Нет состояний; • Нет присваиваний; • Нет последовательного выполнения команд; • Подобия циклов с помощью рекурсии; • Функции высших порядков.
  • 8.
    Достоинства ФП • Болееясная семантика; • Большее соответствие математическим моделям; • льшая свобода исполнения операций.
  • 9.
    Достоинства ФП • Выразительностьи элегантность; • Параметризация и модульность; • Удобные способы представления бесконечных данных.
  • 10.
    Недостатки ФП • Ввод-вывод; •Интерактивные программы; • Относительно высокий порог вхождения.
  • 11.
    λ -исчисление —основа ФП • 1930-е г. – А. Чѐрч разработал теорию λ- исчисления; • 1958 г. – Дж. Маккарти изобрѐл LISP; • 1973 г. – Создан язык ML; • 1985 г. – На основе ML создан Oсaml; • 2002 г. – На основе OCaml создан F#
  • 12.
    λ -нотация Пишем λx.F[x] чтобы определить функцию от x, которая возвращает F[x]
  • 13.
    Примеры (λx.2x + 1) 3 β-редукция: (λx.2x + 1) 3 = 2∙3 + 1 δ-редукция: 2∙3 + 1 = 7
  • 14.
    (λx y.x +y) 1 β-редукция: (λx y.x + y) 1 = λy.1 + y
  • 15.
    λx y.x +y = λx.(λy.x + y)
  • 16.
    (λx.x x) (λx.xx) = (λy.y y) (λx.x x) = (λx.x x) (λx.x x) Получили невычислимое выражение. (λx.1)(λx.x x) (λx.x x)
  • 17.
    Основные элементы функциональных языков программирования • Type inference (вывод типов); • Higher-order function (функция высшего порядка); • Pattern matching (сопоставление с образцом);
  • 18.
    Type inference • Нетнеобходимости использовать явные декларации типов; • Автоматический вывод типов; • Модель типизации Хиндли-Милнера; • Работает не всегда.
  • 19.
    Higher-order function Функция, принимающаяили возвращающая функцию: List.map (fun i -> i*i) [1; 2; 3; 4];; val it : int list = [1; 4; 9; 16]
  • 20.
    Pattern matching let xorx y = match x, y with | true, true -> false | true, false -> true | false, true -> true | false, false -> false ;; val xor : bool -> bool -> bool
  • 21.
    F# killer features: •Мультипарадигменный язык с упором на функциональное программирование; • Статическая типизация; • Интероперабельность с .NET; • Ленивые вычисления.
  • 22.
    Начало работы сF# • .fs – файл с исходным кодом; • fsi.exe – REPL; • fsc.exe; • Mono.
  • 23.
    Система типов F# •Типы значений • System.byte, System.Int32, System.Char и т.д. • Типы функций • string -> string -> string • Присвоение значений • let value = 15;; • let mutable value = 77;;
  • 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]
  • 25.
    Объекты и классы typeBook = val title : string val author : string val publishDate : DateTime new (t, a, pd) = { title = t author = a publishDate = pd}
  • 26.
    Объекты и классы typeBook = val title : string val author : string val publishDate : DateTime new (t:string, a:string, pd) = //произвольный код { title = t author = a publishDate = pd } //произвольный код
  • 27.
    Объекты и классы typeBook = (title : string, author : string,) = member this.Title = title member this.Author = author
  • 28.
    Методы • Начинаются сключевого слова member • Модификаторы public, private, internal • Нет модификатора protected • Поддержка перегрузки методов
  • 29.
  • 30.
    Зачем это нужно? •Расширить кругозор; • Повысить производительность; • Понять суть; • Быть в курсе.
  • 31.
    Типичные задачи • Обработкаданных • синтаксический разбор; • компиляторы; • Data Mining; • Вычислительные задачи • Параллельное программирование
  • 32.
    ФП в реальныхпроектах • Twitter, Facebook; • AutoCAD; • Emacs; • Maxima; • Ericsson
  • 33.
  • 34.
    Проблемы • Библиотеки; • Обучение; •Популярность; • Инструментальные средства.
  • 35.
  • 36.
    Литература An introduction to Functional Programming through Lambda Calculus
  • 37.
    Литература Foundations of F#
  • 38.
  • 39.
    Литература F# for Scientists
  • 40.
    Спасибо за внимание Александр Карпич avkarpich@gmail.com @_ymn