SlideShare a Scribd company logo
1 of 43
Функциональное программирование для
разработки распределенных, облачных и
     веб-приложений на языке F#
            Дмитрий Сошников
        Майкрософт / НИУ ВШЭ / МАИ
             twitter.com/shwars
О чем пойдёт речь?
Функциональное программирование на практике
    • Недавно на habr: создание веб-сайта на Common Lisp
Про что поговорим
    • Немного истории и философии
    • Немного про F#: Построение фрактала на F# в 2+10 строчек кода
    • Концепция 3 экранов
    • F# в веб-программировании: ASP.NET, Windows Azure
    • Распределенное программирование на F#: Quotations
    • WebSharper
    • О книге «Функциональное программирование на F#»
Q&A
Откуда взялся F#?
FORTRAN                  Lisp


               Scheme             ML


      Common             Hope              SML
        Lisp

  …
                        Miranda            Caml


                        Haskell            OCaml


                                  C# 5.0    F#
Зачем?
John Hughes, Why Functional Programming
  Matters, 1984
           +                                -
  Более выразительный язык
       (меньше писать,
       больше думать)

  Нет побочных эффектов =>
         нет ошибок
                                        X
                                      Менее эффективный
                                       (сборка мусора)


                                          Нужны более
                                      квалифицированные
                                         программисты
  Нет переменных => проще
        параллелизм
Функциональное программирование


    Парадигма      • Свои языки программирования
программирования   • F#, Haskell, LISP, Scheme, Erlang, ML, OCaml, ….



                   • Применяется к входным данным и даёт
 Программа – это     выходные
    функция        • Строится из других (более простых) функций


В функциональном
                   • переменных
программировании   • побочных эффектов
       нет
Вкус функционального
               программирования
let double x = x*2
Console.WriteLine(double 2)

let rec pow_of_2 x n =
  if n<=32 then
    printfn “2**%d = %d” n x
    pow_of_2 (double x) (n+1)

let rec rpt n f x =                    let rec rpt n f =
    if n=0 then x                          if n=0 then fun x->x
    else f (rpt (n-1) f x)                 else f >> (rpt (n-1) f)

let rec для a b f =
   if a<=b then
     f a
     для (a+1) b f

для 1 32 (fun i->
           printfn “2**%d = %d” i (rpt i double 1))

for i in 1..32 do
   printfn “2**%d = %d” i (rpt i double 1)
Множество
Мандельброта
Немного математики
Множество M точек z C на комплексной плоскости
Рассмотрим последовательность
  • zn+1(c)= zn2(c)+c
  • z0(c)=0

Множество Мандельброта:
    M = { c C | lim zn(c)<∞}

Множество, похожее на множество Мандельброта:
    M’= { c C | |z20(0)|<1 }
Реализация F#
let mandelf (c:Complex) (z:Complex) = z*z+c

let ismandel c = Complex.Abs(rpt (mandelf c) 20 Complex.zero)<1.0


let scale (x:float,y:float) (u,v) n = float(n-u)/float(v-u)*(y-x)+x

for i = 1 to 60 do
 for j = 1 to 60 do
   let lscale = scale (-1.2,1.2) (1,60) in
   let t = complex (lscale j) (lscale i) in
     Write(if ismandel t then "*" else " ")
 WriteLine("")
WinForms
#light
open System.Drawing
open System.Windows.Forms

let form =
   let image = new Bitmap(400, 400)
   let lscale = scale (-1.0,1.0) (0,400)
   for i = 0 to (image.Height-1) do
     for j = 0 to (image.Width-1) do
       let t = complex (lscale i) (lscale j) in
       image.SetPixel(i,j,if ismandel t then Color.Black else Color.White)
   let temp = new Form()
   temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0))
   temp

[<STAThread>]
do Application.Run(form);;
Результат
F# - это:
Мультипарадигмальный               Компактный код
язык                               • Автоматический вывод типов –
• Функционально-императивный         при статической типизации!
• С акцентом на функциональном     • Встроенные структуры данных,
  программировании                   своя библиотека обработки




Интероперабельность с .NET         Эффективный язык
• Все возможности .NET Framework   • Статическая типизация
• Двухсторонняя                    • Оптимизаторы порождают
  интероперабельность с              качественный .NET-код
  пользовательским кодом             (оптимизация хвостовой
                                     рекурсии)
                                   • Ленивые вычисления

    • на платформе Microsoft.NET
Роль F# в экосистеме языков
F# - новаторский язык, в котором воплощаются смелые идеи
   • F# 2.0 – асинхронное/параллельное программирование
     (перекочевало в C# 5.0)
   • F# 3.0 – type providers
F# используется во внутренних проектах
   •   Driver Development Kit 0- верификация кода
   •   F# написан на F# (догадайтесь, как такое возможно?)
   •   Игры XBox Live Arcade
   •   AdCenter Challenge
F# начинает проникать в различные сферы
   •   Финансовая аналитика (на смену Excel)
   •   Научные вычисления (на смену Matlab/MathCad -> eg. VSLab)
   •   Genome Viewer
   •   DSL
КОНЦЕПЦИЯ ТРЕХ ЭКРАНОВ
C# / VB.NET                                         F#




Browser          Application     Phone App   Game

                HTML5
                                      XNA
              Silverlight
                               .NET
ФУНКЦИОНАЛЬНОЕ
ВЕБ-ПРОГРАММИРОВАНИЕ
на платформе Microsoft.NET
Почему ФП хорошо для веба?
Веб – это про обработку данных
  • Модель запрос-ответ
  • Web is stateless, as are pure functions
В распределённых веб-системах много
  асинхронности
  • F# удобен для таких задач
  • Но это выходит за рамки нашего разговора
F# - это вообще круто
  • Меньше кода, больше думать
Варианты?
ASP.NET Web Forms
 • Интерфейс на C#, библиотека на F#
 • Интерфейс на F#

ASP.NET MVC
 • Models, Controllers
 • Unit Tests
Облачные вычисления Windows Azure
 • Worker Role
 • Web Role
WebSharper
 • Серверный код
 • Клиентский код
ASP.NET Web Forms на F#
<%@ Page Language="F#" %>
<!DOCTYPE html … >
<script language="F#" runat="server">
      member this.prime100 =
       let rec primes = function
          | [] -> []
          | h::t -> h::primes(List.filter (fun x->x%h>0) t)
       primes [2..100] |> List.fold (fun x y -> x+","+y.ToString()) ""
                       |> fun x-> x.Substring(1)
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>The first 100 prime numers are <%= this.prime100 %></p>
</body>
</html>


Чтобы это работало, надо соответствующим образом подправить файл
конфигурации
Облачные вычисления
    Web Role

    • Web Interface / Web Service
    • ASP.NET WF / MVC
    • C#

    Worker Role

    • C# / F#
    • Background Computation / Web Service

    Azure Storage

    • Прозрачный доступ к очередям / blob
    • Модели данных на C# / F# для таблиц

Естественно, можно использовать F# из внешнего проекта в отдельной
сборке
Azure Worker Role
type Worker() =
    inherit RoleEntryPoint()

   let log message kind = Trace.WriteLine(message, kind)

   let mutable queue_in : CloudQueue = null
   let mutable queue_out : CloudQueue = null

   override wr.Run() =
       log "Starting computation agent..." "Information"
       while(true) do
           let msg = queue_in.GetMessage()
           if msg=null
               then Thread.Sleep(1000)
               else
                   ProcessMessage(msg.AsString)
                   queue_in.DeleteMessage(msg)
           log "Processing queue" "Information"
Проект слабосвязанных облачных
   вычислений (Parametric Sweep)
Концептуальный проект
   библиотеки для
   облегчения
   программирования легко
   параллелящихся
   вычислительных задач
Выпускная работа отд.ПИ
   НИУ ВШЭ (Таймураз
   Абаев)
Клиентская и серверная часть
   реализованы на F#
Quotations, Remote Execution, WebSharper

F# ДЛЯ РАСПРЕДЕЛЕННОГО
ПРОГРАММИРОВАНИЯ
Quotations
<@@ (1+2)*3 @@>

val it : Expr
= Call (None, Int32 op_Multiply[Int32,Int32,Int32](Int32, Int32),
      [Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32,
Int32),
             [Value (1), Value (2)]), Value (3)])
    {Type = System.Int32;}

let rec power n x =               let rec metapower n x =
  if n=0 then 1                     if n=0 then <@ 1 @>
  else x*power (n-1) x              else (fun z -> <@ %x * %z @>)
                                  (metapower(n-1) x)
let pow5 = power 5
let pow5 x = x*x*x*x*x

let qeval = Microsoft.FSharp.Linq.QuotationEvaluator.Evaluate

let pow5 x = metapower 5 <@ x @> |> qeval
Удалённое выполнение
let ex = new RExecutor<int>()
ex.Eval(<@ 1+2+3 @>) |> printfn "%A"

ex.Eval <@ [1..100] |> List.sum @> |> printfn "%A"
[1;2;3;4]
  |> List.map (fun x -> ex.Eval <@ x+1 @>)
  |> printfn "%A"

let ex = new RExecutor<int>()
[1..30]
 |> List.map
     (fun z ->
        ex.Eval
         <@ let rec fib x =
              if x<2 then 1
              else fib (x-1)+fib(x-2)
            in fib z @>)
 |> printfn "%A"
Архитектура библиотеки
удалённого выполнения
WebSharper
Идея: программировать веб-систему на одном языке
Разделение кода между клиентским и серверным
Реализация:
  • Клиентский F#-код транслируется в JavaScript с
    использованием Quotations
  • Серверный код – выполняется на сервере обычным
    образом
  • Удалённый вызов производится прозначным образом!
DSL для генерации кода страницы
http://www.websharper.com
W# Client Execution
[<JavaScriptType>]
type MainPage() =
    inherit Web.Control()
    [<JavaScript>]
    override this.Body =
       let result = P [Text ""]
       Div [
          P [Text "Press to retrieve data"]
          Input [Type "Button"; Value "Get Data"]
          |>! OnClick (fun e a -> result.Text <- Application.GetPrimes())
            result ]

module Application =
    [<JavaScript>]
    let rec primes = function
              [] -> []
            | h::t -> h::primes(List.filter (fun x -> x%h>0) t)
    [<JavaScript>]
    let GetPrimes() = primes [2..100]
                       |> List.fold (fun s i -> s+" "+i.ToString()) ""
Трансляция в JavaScript
let rec primes = function
            | [] -> []
            | h::t -> h::primes(List.filter (fun x -> x%h>0) t)




(WebSharperProject$.Application$).primes =
function (_arg1)
{
  var __1;
  if (_arg1.$ == 1)
  {
    var t = _arg1.$1; var h = _arg1.$0;
    var l = t;
    var p = function (x) { return x % h > 0; };
    __1 =
    new W$.$List({$: 1,$0: h, $1:
((WebSharperProject$.Application$).primes)(
((W$.Seq$).toList)(((W$.Seq$).filter)(p, l)))
                 });}
  else { __1 = new W$.$List({ $: 0 }); }
  return __1; };
W# Server Execution
[<JavaScriptType>]
type MainPage() =
    inherit Web.Control()
    [<JavaScript>]
    override this.Body =
       let result = P [Text ""]
       Div [
          P [Text "Press to retrieve data"]
          Input [Type "Button"; Value "Get Data"]
          |>! OnClick (fun e a -> result.Text <- Application.GetPrimes())
            result ]

module Application =
    let rec primes = function
              [] -> []
            | h::t -> h::primes(List.filter (fun x -> x%h>0) t)
    [<Rpc>]
    let GetPrimes() = primes [2..100]
                       |> List.fold (fun s i -> s+" "+i.ToString()) ""
Абстракции AJAX-интерфейса
Пейджлеты
• Элемент управления, выполняющийся на клиенте

Формлеты
• Элемент управления, привязанный к определённой
  модели данных
Флоулеты
• Определение последовательности смены
  формлетов
W# Formlets
[<JavaScript>]
override this.Body =
              let res = P [Text ""]
              Div [
                formlet {
                  let! max = Controls.Input "100"
                              |> Validator.IsInt "Must be int"
                  return max |> int }
                |> Enhance.WithTextLabel "Enter max number:"
                |> Enhance.WithValidationIcon
                |> Enhance.WithSubmitAndResetButtons
                |> Enhance.WithFormContainer
                |>Formlet.Run(fun n-> res.Text<-Application.GetPrimes(n))
                res ]
КНИГА
«ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ НА
F#»
Издательство ДМК Пресс
Источники
Д. Сошников. Функциональное программирование на F#.
     ДМК-Пресс, 2011.
К. Смит. Программирование на F#. – М.: Символ-Плюс, 2011.
     (перевод C. Smith, Programming F#: A comprehensive
     guide for writing simple code to solve complex problems.
     O’Reilly, 2010)
Курс Д.Сошникова «Функциональное программирование»
     на intuit.ru
R.Pickering, Beginning F#, Apress, 2009.
D.Syme, A.Granicz, A.Cisternio. Expert F# 2.0. A-Press, 2010
T.Neward, A.Erickson, T.Crowell, R.Minerich. Professional F# 2.0.
     Wiley Publishing, 2011.
J.Harrop, F# for Scientists, Wiley, 2008.
Полезнейшие веб-ресурсы:
http://tryfsharp.org – вы можете попробовать
  F# прямо в браузере!
http://fssnip.net – множество коротких
  примеров кода на F# на все случаи жизни
http://www.soshnikov.com/fsharp - множество
  примеров кода, последовательно
  раскрывающих материал
http://www.ms-library.ru – библиотека
  учебных курсов Майкрософт
Вопросы
• Дмитрий Сошников
  – Технологический евангелист, координатор
    академических программ
  – dmitryso@microsoft.com
  – http://blogs.msdn.com/sos
  – http://twitter.com/shwars
Спасибо за внимание
      Иван Иванов
      Иванов-Софт
  ivan@ivanovsoft.com
 twitter.com/ivanivanov
Пожалуйста, поставьте
 оценку моему докладу.

Ваше мнение очень важно.

        Спасибо!

More Related Content

What's hot

Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
Программирование линейных алгоритмов
Программирование линейных алгоритмовПрограммирование линейных алгоритмов
Программирование линейных алгоритмовAndrey Dolinin
 
Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмовAndrey Dolinin
 
введение
введениевведение
введениеAndEdr
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3Ann Eres
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NETRoman Nevolin
 
Алгоритмы и языки программирования
Алгоритмы и языки программированияАлгоритмы и языки программирования
Алгоритмы и языки программированияTheoretical mechanics department
 
Способы записи алгоритмов
Способы записи алгоритмовСпособы записи алгоритмов
Способы записи алгоритмовAndrey Dolinin
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальAndrey Dolinin
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинMachine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинIT61
 

What's hot (15)

Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
Программирование линейных алгоритмов
Программирование линейных алгоритмовПрограммирование линейных алгоритмов
Программирование линейных алгоритмов
 
Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмов
 
введение
введениевведение
введение
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NET
 
Алгоритмы и языки программирования
Алгоритмы и языки программированияАлгоритмы и языки программирования
Алгоритмы и языки программирования
 
Способы записи алгоритмов
Способы записи алгоритмовСпособы записи алгоритмов
Способы записи алгоритмов
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования Паскаль
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление. Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление.
 
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинMachine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий Лапин
 

Viewers also liked

SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...Dmitri Soshnikov
 
Увлекательный мир программирования.
Увлекательный мир программирования.Увлекательный мир программирования.
Увлекательный мир программирования.Dmitri Soshnikov
 
reactive dotNet
reactive dotNetreactive dotNet
reactive dotNet0xffAA
 
Машинное обучение для школьников
Машинное обучение для школьниковМашинное обучение для школьников
Машинное обучение для школьниковDmitri Soshnikov
 
Design Patterns in Modern C++
Design Patterns in Modern C++Design Patterns in Modern C++
Design Patterns in Modern C++Dmitri Nesteruk
 
Data mining в реальном проекте
Data mining в реальном проектеData mining в реальном проекте
Data mining в реальном проектеAlexander Byndyu
 
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrackБаг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrackAlexander Byndyu
 
Машинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterМашинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterRoman Nevolin
 
CallSharp: Automatic Input/Output Matching in .NET
CallSharp: Automatic Input/Output Matching in .NETCallSharp: Automatic Input/Output Matching in .NET
CallSharp: Automatic Input/Output Matching in .NETDmitri Nesteruk
 
Шаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решенияШаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решенияAlexander Byndyu
 
Большие возможности для маленькой компании
Большие возможности для маленькой компанииБольшие возможности для маленькой компании
Большие возможности для маленькой компанииAlexander Byndyu
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаAlexander Byndyu
 
Программирование и информационные технологии
Программирование и информационные технологииПрограммирование и информационные технологии
Программирование и информационные технологииSPBU_RU UNIVERSITY
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповOntico
 
Программирование доступное каждому
Программирование доступное каждомуПрограммирование доступное каждому
Программирование доступное каждомуMichael Akimov
 

Viewers also liked (20)

Tpl DataFlow
Tpl DataFlowTpl DataFlow
Tpl DataFlow
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
 
Увлекательный мир программирования.
Увлекательный мир программирования.Увлекательный мир программирования.
Увлекательный мир программирования.
 
reactive dotNet
reactive dotNetreactive dotNet
reactive dotNet
 
Машинное обучение для школьников
Машинное обучение для школьниковМашинное обучение для школьников
Машинное обучение для школьников
 
Design Patterns in Modern C++
Design Patterns in Modern C++Design Patterns in Modern C++
Design Patterns in Modern C++
 
Data mining в реальном проекте
Data mining в реальном проектеData mining в реальном проекте
Data mining в реальном проекте
 
Час Кода 2015
Час Кода 2015Час Кода 2015
Час Кода 2015
 
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrackБаг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
 
Машинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterМашинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 Piter
 
CallSharp: Automatic Input/Output Matching in .NET
CallSharp: Automatic Input/Output Matching in .NETCallSharp: Automatic Input/Output Matching in .NET
CallSharp: Automatic Input/Output Matching in .NET
 
Шаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решенияШаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решения
 
Большие возможности для маленькой компании
Большие возможности для маленькой компанииБольшие возможности для маленькой компании
Большие возможности для маленькой компании
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продукта
 
Новые тимбилдинги для жаркого лета 2014
Новые тимбилдинги для жаркого лета 2014Новые тимбилдинги для жаркого лета 2014
Новые тимбилдинги для жаркого лета 2014
 
Программирование и информационные технологии
Программирование и информационные технологииПрограммирование и информационные технологии
Программирование и информационные технологии
 
Урок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программированиеУрок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программирование
 
Функциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита ПрокоповФункциональное программирование в браузере / Никита Прокопов
Функциональное программирование в браузере / Никита Прокопов
 
Программирование доступное каждому
Программирование доступное каждомуПрограммирование доступное каждому
Программирование доступное каждому
 

Similar to Функциональное программирование для разработки распределённых, облачных и веб-приложений на языкe F#

Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU
 
Back to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняBack to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняTech Talks @NSU
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Программирование: от сложного к простому
Программирование: от сложного к простомуПрограммирование: от сложного к простому
Программирование: от сложного к простомуNikolay Grebenshikov
 
Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages_ymn
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Console application with ZF 2.0
Console application with ZF 2.0Console application with ZF 2.0
Console application with ZF 2.0Alexey Kachayev
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'110xffAA
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageAlexander Granin
 
Haskell
HaskellHaskell
HaskellDevDay
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 

Similar to Функциональное программирование для разработки распределённых, облачных и веб-приложений на языкe F# (20)

Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
 
Back to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняBack to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодня
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Программирование: от сложного к простому
Программирование: от сложного к простомуПрограммирование: от сложного к простому
Программирование: от сложного к простому
 
Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Console application with ZF 2.0
Console application with ZF 2.0Console application with ZF 2.0
Console application with ZF 2.0
 
Coroutines
CoroutinesCoroutines
Coroutines
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'11
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Haskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell languageHaskell Lite - presentation for DevDay about Haskell language
Haskell Lite - presentation for DevDay about Haskell language
 
Haskell
HaskellHaskell
Haskell
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 

More from Dmitri Soshnikov

Принципы создания приложений виртуальной и расширенной реальности с примерами...
Принципы создания приложений виртуальной и расширенной реальности с примерами...Принципы создания приложений виртуальной и расширенной реальности с примерами...
Принципы создания приложений виртуальной и расширенной реальности с примерами...Dmitri Soshnikov
 
DevCon 2014: Вдохновляем детей с помощью технологий
DevCon 2014: Вдохновляем детей с помощью технологийDevCon 2014: Вдохновляем детей с помощью технологий
DevCon 2014: Вдохновляем детей с помощью технологийDmitri Soshnikov
 
SECR2013: Как научить ваших детей программировать
SECR2013: Как научить ваших детей программироватьSECR2013: Как научить ваших детей программировать
SECR2013: Как научить ваших детей программироватьDmitri Soshnikov
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Языки программирования
Языки программированияЯзыки программирования
Языки программированияDmitri Soshnikov
 
MoITvation - презентация-размышление о роли IT в современном мире с конкретны...
MoITvation - презентация-размышление о роли IT в современном мире с конкретны...MoITvation - презентация-размышление о роли IT в современном мире с конкретны...
MoITvation - презентация-размышление о роли IT в современном мире с конкретны...Dmitri Soshnikov
 
Обзор программных средств Майкрософт для графики и визуализации: коммерческой...
Обзор программных средств Майкрософт для графики и визуализации: коммерческой...Обзор программных средств Майкрософт для графики и визуализации: коммерческой...
Обзор программных средств Майкрософт для графики и визуализации: коммерческой...Dmitri Soshnikov
 
Cloud Computing - новая парадигма облачных вычислений. Windows Azure.
Cloud Computing - новая парадигма облачных вычислений. Windows Azure.Cloud Computing - новая парадигма облачных вычислений. Windows Azure.
Cloud Computing - новая парадигма облачных вычислений. Windows Azure.Dmitri Soshnikov
 

More from Dmitri Soshnikov (8)

Принципы создания приложений виртуальной и расширенной реальности с примерами...
Принципы создания приложений виртуальной и расширенной реальности с примерами...Принципы создания приложений виртуальной и расширенной реальности с примерами...
Принципы создания приложений виртуальной и расширенной реальности с примерами...
 
DevCon 2014: Вдохновляем детей с помощью технологий
DevCon 2014: Вдохновляем детей с помощью технологийDevCon 2014: Вдохновляем детей с помощью технологий
DevCon 2014: Вдохновляем детей с помощью технологий
 
SECR2013: Как научить ваших детей программировать
SECR2013: Как научить ваших детей программироватьSECR2013: Как научить ваших детей программировать
SECR2013: Как научить ваших детей программировать
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Языки программирования
Языки программированияЯзыки программирования
Языки программирования
 
MoITvation - презентация-размышление о роли IT в современном мире с конкретны...
MoITvation - презентация-размышление о роли IT в современном мире с конкретны...MoITvation - презентация-размышление о роли IT в современном мире с конкретны...
MoITvation - презентация-размышление о роли IT в современном мире с конкретны...
 
Обзор программных средств Майкрософт для графики и визуализации: коммерческой...
Обзор программных средств Майкрософт для графики и визуализации: коммерческой...Обзор программных средств Майкрософт для графики и визуализации: коммерческой...
Обзор программных средств Майкрософт для графики и визуализации: коммерческой...
 
Cloud Computing - новая парадигма облачных вычислений. Windows Azure.
Cloud Computing - новая парадигма облачных вычислений. Windows Azure.Cloud Computing - новая парадигма облачных вычислений. Windows Azure.
Cloud Computing - новая парадигма облачных вычислений. Windows Azure.
 

Функциональное программирование для разработки распределённых, облачных и веб-приложений на языкe F#

  • 1. Функциональное программирование для разработки распределенных, облачных и веб-приложений на языке F# Дмитрий Сошников Майкрософт / НИУ ВШЭ / МАИ twitter.com/shwars
  • 2. О чем пойдёт речь? Функциональное программирование на практике • Недавно на habr: создание веб-сайта на Common Lisp Про что поговорим • Немного истории и философии • Немного про F#: Построение фрактала на F# в 2+10 строчек кода • Концепция 3 экранов • F# в веб-программировании: ASP.NET, Windows Azure • Распределенное программирование на F#: Quotations • WebSharper • О книге «Функциональное программирование на F#» Q&A
  • 3.
  • 4. Откуда взялся F#? FORTRAN Lisp Scheme ML Common Hope SML Lisp … Miranda Caml Haskell OCaml C# 5.0 F#
  • 5. Зачем? John Hughes, Why Functional Programming Matters, 1984 + - Более выразительный язык (меньше писать, больше думать) Нет побочных эффектов => нет ошибок X Менее эффективный (сборка мусора) Нужны более квалифицированные программисты Нет переменных => проще параллелизм
  • 6.
  • 7.
  • 8. Функциональное программирование Парадигма • Свои языки программирования программирования • F#, Haskell, LISP, Scheme, Erlang, ML, OCaml, …. • Применяется к входным данным и даёт Программа – это выходные функция • Строится из других (более простых) функций В функциональном • переменных программировании • побочных эффектов нет
  • 9. Вкус функционального программирования let double x = x*2 Console.WriteLine(double 2) let rec pow_of_2 x n = if n<=32 then printfn “2**%d = %d” n x pow_of_2 (double x) (n+1) let rec rpt n f x = let rec rpt n f = if n=0 then x if n=0 then fun x->x else f (rpt (n-1) f x) else f >> (rpt (n-1) f) let rec для a b f = if a<=b then f a для (a+1) b f для 1 32 (fun i-> printfn “2**%d = %d” i (rpt i double 1)) for i in 1..32 do printfn “2**%d = %d” i (rpt i double 1)
  • 11. Немного математики Множество M точек z C на комплексной плоскости Рассмотрим последовательность • zn+1(c)= zn2(c)+c • z0(c)=0 Множество Мандельброта: M = { c C | lim zn(c)<∞} Множество, похожее на множество Мандельброта: M’= { c C | |z20(0)|<1 }
  • 12. Реализация F# let mandelf (c:Complex) (z:Complex) = z*z+c let ismandel c = Complex.Abs(rpt (mandelf c) 20 Complex.zero)<1.0 let scale (x:float,y:float) (u,v) n = float(n-u)/float(v-u)*(y-x)+x for i = 1 to 60 do for j = 1 to 60 do let lscale = scale (-1.2,1.2) (1,60) in let t = complex (lscale j) (lscale i) in Write(if ismandel t then "*" else " ") WriteLine("")
  • 13. WinForms #light open System.Drawing open System.Windows.Forms let form = let image = new Bitmap(400, 400) let lscale = scale (-1.0,1.0) (0,400) for i = 0 to (image.Height-1) do for j = 0 to (image.Width-1) do let t = complex (lscale i) (lscale j) in image.SetPixel(i,j,if ismandel t then Color.Black else Color.White) let temp = new Form() temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)) temp [<STAThread>] do Application.Run(form);;
  • 15. F# - это: Мультипарадигмальный Компактный код язык • Автоматический вывод типов – • Функционально-императивный при статической типизации! • С акцентом на функциональном • Встроенные структуры данных, программировании своя библиотека обработки Интероперабельность с .NET Эффективный язык • Все возможности .NET Framework • Статическая типизация • Двухсторонняя • Оптимизаторы порождают интероперабельность с качественный .NET-код пользовательским кодом (оптимизация хвостовой рекурсии) • Ленивые вычисления • на платформе Microsoft.NET
  • 16. Роль F# в экосистеме языков F# - новаторский язык, в котором воплощаются смелые идеи • F# 2.0 – асинхронное/параллельное программирование (перекочевало в C# 5.0) • F# 3.0 – type providers F# используется во внутренних проектах • Driver Development Kit 0- верификация кода • F# написан на F# (догадайтесь, как такое возможно?) • Игры XBox Live Arcade • AdCenter Challenge F# начинает проникать в различные сферы • Финансовая аналитика (на смену Excel) • Научные вычисления (на смену Matlab/MathCad -> eg. VSLab) • Genome Viewer • DSL
  • 18.
  • 19. C# / VB.NET F# Browser Application Phone App Game HTML5 XNA Silverlight .NET
  • 21. Почему ФП хорошо для веба? Веб – это про обработку данных • Модель запрос-ответ • Web is stateless, as are pure functions В распределённых веб-системах много асинхронности • F# удобен для таких задач • Но это выходит за рамки нашего разговора F# - это вообще круто • Меньше кода, больше думать
  • 22. Варианты? ASP.NET Web Forms • Интерфейс на C#, библиотека на F# • Интерфейс на F# ASP.NET MVC • Models, Controllers • Unit Tests Облачные вычисления Windows Azure • Worker Role • Web Role WebSharper • Серверный код • Клиентский код
  • 23. ASP.NET Web Forms на F# <%@ Page Language="F#" %> <!DOCTYPE html … > <script language="F#" runat="server"> member this.prime100 = let rec primes = function | [] -> [] | h::t -> h::primes(List.filter (fun x->x%h>0) t) primes [2..100] |> List.fold (fun x y -> x+","+y.ToString()) "" |> fun x-> x.Substring(1) </script> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <p>The first 100 prime numers are <%= this.prime100 %></p> </body> </html> Чтобы это работало, надо соответствующим образом подправить файл конфигурации
  • 24. Облачные вычисления Web Role • Web Interface / Web Service • ASP.NET WF / MVC • C# Worker Role • C# / F# • Background Computation / Web Service Azure Storage • Прозрачный доступ к очередям / blob • Модели данных на C# / F# для таблиц Естественно, можно использовать F# из внешнего проекта в отдельной сборке
  • 25. Azure Worker Role type Worker() = inherit RoleEntryPoint() let log message kind = Trace.WriteLine(message, kind) let mutable queue_in : CloudQueue = null let mutable queue_out : CloudQueue = null override wr.Run() = log "Starting computation agent..." "Information" while(true) do let msg = queue_in.GetMessage() if msg=null then Thread.Sleep(1000) else ProcessMessage(msg.AsString) queue_in.DeleteMessage(msg) log "Processing queue" "Information"
  • 26. Проект слабосвязанных облачных вычислений (Parametric Sweep) Концептуальный проект библиотеки для облегчения программирования легко параллелящихся вычислительных задач Выпускная работа отд.ПИ НИУ ВШЭ (Таймураз Абаев) Клиентская и серверная часть реализованы на F#
  • 27. Quotations, Remote Execution, WebSharper F# ДЛЯ РАСПРЕДЕЛЕННОГО ПРОГРАММИРОВАНИЯ
  • 28. Quotations <@@ (1+2)*3 @@> val it : Expr = Call (None, Int32 op_Multiply[Int32,Int32,Int32](Int32, Int32), [Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (2)]), Value (3)]) {Type = System.Int32;} let rec power n x = let rec metapower n x = if n=0 then 1 if n=0 then <@ 1 @> else x*power (n-1) x else (fun z -> <@ %x * %z @>) (metapower(n-1) x) let pow5 = power 5 let pow5 x = x*x*x*x*x let qeval = Microsoft.FSharp.Linq.QuotationEvaluator.Evaluate let pow5 x = metapower 5 <@ x @> |> qeval
  • 29. Удалённое выполнение let ex = new RExecutor<int>() ex.Eval(<@ 1+2+3 @>) |> printfn "%A" ex.Eval <@ [1..100] |> List.sum @> |> printfn "%A" [1;2;3;4] |> List.map (fun x -> ex.Eval <@ x+1 @>) |> printfn "%A" let ex = new RExecutor<int>() [1..30] |> List.map (fun z -> ex.Eval <@ let rec fib x = if x<2 then 1 else fib (x-1)+fib(x-2) in fib z @>) |> printfn "%A"
  • 31. WebSharper Идея: программировать веб-систему на одном языке Разделение кода между клиентским и серверным Реализация: • Клиентский F#-код транслируется в JavaScript с использованием Quotations • Серверный код – выполняется на сервере обычным образом • Удалённый вызов производится прозначным образом! DSL для генерации кода страницы http://www.websharper.com
  • 32. W# Client Execution [<JavaScriptType>] type MainPage() = inherit Web.Control() [<JavaScript>] override this.Body = let result = P [Text ""] Div [ P [Text "Press to retrieve data"] Input [Type "Button"; Value "Get Data"] |>! OnClick (fun e a -> result.Text <- Application.GetPrimes()) result ] module Application = [<JavaScript>] let rec primes = function [] -> [] | h::t -> h::primes(List.filter (fun x -> x%h>0) t) [<JavaScript>] let GetPrimes() = primes [2..100] |> List.fold (fun s i -> s+" "+i.ToString()) ""
  • 33. Трансляция в JavaScript let rec primes = function | [] -> [] | h::t -> h::primes(List.filter (fun x -> x%h>0) t) (WebSharperProject$.Application$).primes = function (_arg1) { var __1; if (_arg1.$ == 1) { var t = _arg1.$1; var h = _arg1.$0; var l = t; var p = function (x) { return x % h > 0; }; __1 = new W$.$List({$: 1,$0: h, $1: ((WebSharperProject$.Application$).primes)( ((W$.Seq$).toList)(((W$.Seq$).filter)(p, l))) });} else { __1 = new W$.$List({ $: 0 }); } return __1; };
  • 34. W# Server Execution [<JavaScriptType>] type MainPage() = inherit Web.Control() [<JavaScript>] override this.Body = let result = P [Text ""] Div [ P [Text "Press to retrieve data"] Input [Type "Button"; Value "Get Data"] |>! OnClick (fun e a -> result.Text <- Application.GetPrimes()) result ] module Application = let rec primes = function [] -> [] | h::t -> h::primes(List.filter (fun x -> x%h>0) t) [<Rpc>] let GetPrimes() = primes [2..100] |> List.fold (fun s i -> s+" "+i.ToString()) ""
  • 35. Абстракции AJAX-интерфейса Пейджлеты • Элемент управления, выполняющийся на клиенте Формлеты • Элемент управления, привязанный к определённой модели данных Флоулеты • Определение последовательности смены формлетов
  • 36. W# Formlets [<JavaScript>] override this.Body = let res = P [Text ""] Div [ formlet { let! max = Controls.Input "100" |> Validator.IsInt "Must be int" return max |> int } |> Enhance.WithTextLabel "Enter max number:" |> Enhance.WithValidationIcon |> Enhance.WithSubmitAndResetButtons |> Enhance.WithFormContainer |>Formlet.Run(fun n-> res.Text<-Application.GetPrimes(n)) res ]
  • 38. Источники Д. Сошников. Функциональное программирование на F#. ДМК-Пресс, 2011. К. Смит. Программирование на F#. – М.: Символ-Плюс, 2011. (перевод C. Smith, Programming F#: A comprehensive guide for writing simple code to solve complex problems. O’Reilly, 2010) Курс Д.Сошникова «Функциональное программирование» на intuit.ru R.Pickering, Beginning F#, Apress, 2009. D.Syme, A.Granicz, A.Cisternio. Expert F# 2.0. A-Press, 2010 T.Neward, A.Erickson, T.Crowell, R.Minerich. Professional F# 2.0. Wiley Publishing, 2011. J.Harrop, F# for Scientists, Wiley, 2008.
  • 39. Полезнейшие веб-ресурсы: http://tryfsharp.org – вы можете попробовать F# прямо в браузере! http://fssnip.net – множество коротких примеров кода на F# на все случаи жизни http://www.soshnikov.com/fsharp - множество примеров кода, последовательно раскрывающих материал http://www.ms-library.ru – библиотека учебных курсов Майкрософт
  • 40.
  • 41. Вопросы • Дмитрий Сошников – Технологический евангелист, координатор академических программ – dmitryso@microsoft.com – http://blogs.msdn.com/sos – http://twitter.com/shwars
  • 42. Спасибо за внимание Иван Иванов Иванов-Софт ivan@ivanovsoft.com twitter.com/ivanivanov
  • 43. Пожалуйста, поставьте оценку моему докладу. Ваше мнение очень важно. Спасибо!

Editor's Notes

  1. СЛОЖНОСТЬСложность окружающего мира влияет на сложность программных системПараллелизм – необходимость писать параллельный код резко увеличивает сложностьСложная система =&gt; большее количество ошибок, резко возрастает стоимость качественного кодаСложность удается частично скрыть с помощью инструментов разработки (пример: языки высокого уровня)Software Factories, Domain-Specific LanguagesАктуальность этих проблем быстро растет со временем