SlideShare a Scribd company logo
1 of 21
Девятая независимая
научно-практическая конференция
«Разработка ПО 2013»
23 - 25 октября, Москва

F# и обработка потоковых данных
Дмитрий Сошников
dmitri@soshnikov.com | twitter.com/shwars
Майкрософт | НИУ ВШЭ | МАИ
Сегодня особенное
выступление
Сегодня я
впервые не буду
рассказывать про
F# как язык
TIOBE Programming Language Index

F# - #24
Common Lisp - #34
Scheme - #35
Scala - #36
Prolog - #38
Erlang - #43
Haskell - #46
Введение и разминка мозга
Вычисление факториала на F#

Очевидно

let rec fact n =
if n=1 then 1 else n*fact(n-1)

Симпатично

let rec fact = function
| 1 -> 1
| n -> n*fact(n-1)

Эффективно

let fact =
let rec fact' acc = function
| 1 -> acc
| n -> fact' (n*acc) (n-1)
fact' 1

Эффективно

let fact =
let rec fact' f = function
| 1 -> f 1
| n -> fact' (f>>((*)n)) (n-1)
fact' (fun x->x)

Во всех случаях – без побочных эффектов
Введение и дальнейшая разминка мозга
Вычисление факториала на F#

Коротко
Каррировано
Лениво
По т-ме Тарского
Извращеннокомбинаторно

let fact n = [1..n] |> List.reduce (*)
let fact = (..) 1 >> Seq.reduce (*)
let fact n = Seq.initInfinite (fun x->x+1)
|> Seq.scan (*) 1 |> Seq.nth n
let rec fix f x = f (fix f) x
let fact = fix (fun f x -> if x=1 then 1 else x*f(x-1))
let s f g x = f x (g x)
let k x y = x
let b f g x = f (g x)
let c f g x = f x g
let rec y f x = f (y f) x
let cond p f g x = if p x then f x else g x
let pred x = x-1
let fact = y (b (cond ((=) 0) (k 1)) (b (s (*)) (c b pred)))

Во всех случаях – без побочных эффектов
Конкурс:
До конца лекции придумайте
еще один способ вычисления
факториала и получите
конфетку!
Обработка данных: списки
map
reduce
fold
filter

[1..10] |> List.map (fun x->x*x)
[1..10] |> List.map (fun x->x*x) |> List.reduce (+)
[1..10] |> List.map (fun x->x*x) |> List.fold (+) 0
[1..10] |> List.filter (fun x-> x%3=0)

f
Пример
Какое минимальное число Фибоначчи делится на

256?

open System.Numerics
let fib (n : BigInteger) =
let rec fib' n max u v acc =
if n>max then acc
else fib' (n+1I) max (u+v) u (u::acc)
List.rev (fib' 0I n 1I 1I [])
fib 200I |> List.filter (fun x->x%256I=0I) |> List.head

let rec find u v =
if (u%256I=0I) then u
else find (u+v) u
find 1I 1I
Обработка данных: последовательности
map
reduce
fold
filter

{1..10} |> Seq.map (fun x->x*x)
{1..10} |> Seq.map (fun x->x*x) |> Seq.reduce (+)
{1..10} |> Seq.map (fun x->x*x) |> Seq.fold (+) 0
{1..10} |> Seq.filter (fun x-> x%3=0)

nextElement()

f(nextElement())
Пример
Какое минимальное число Фибоначчи делится на

256?

Seq.unfold (fun (u,v) -> Some(u,(u+v,u))) (1I,1I)
|> Seq.filter(fun x->x%256I=0I) |> Seq.head

Здесь мы имеем дело с бесконечной последовательностью чисел Фибоначчи! Математики могут быть счастливы!
Практический пример: мера доброты
ReadLines @"c:bookswap_1.txt"
|> Seq.fold (fun (name,mood,result) x ->
if x.Contains("CHAPTER") then (x,0,(name,mood)::result)
else
let (p,n) = MoodAnalyzer.ComputeWeight x
(name,mood+p-n,result))
("",0,[])
|> fun (n,m,res) -> (n,m)::res
|> List.filter (fun (x,y) -> x<>””)
|> FSharpChart.Bar
let ReadMap fn wt =
ReadLines fn |> Seq.map (fun x-> x.Trim())
|> Seq.fold (fun map x -> Map.add x wt map) Map.empty
let Positive = ReadMap @"positive.txt" 1
let Negative = ReadMap @"negative.txt" -1
let wt x map = if Map.containsKey x map then Map.find x map else 0
let ComputeWeight (s : string) =
s.Split([|' ';';';',';'!';'(';')'|])
|> Array.fold (fun (p,n) x -> (p+wt x Positive,n-wt x Negative)) (0,0)
Вывод:

Война и Мир – добрый роман!
(по крайней мере в переводе на английский)
Экскурс:
параллельная и асинхронная обработка
let task1 = async { return 10+10 }
let task2 = async { return 20+20 }
Async.Run (Async.Parallel [ task1; task2 ])
let map' func items =
let tasks =
seq {
for i in items -> async { return (func i) } }
Async.RunSynchronously (Async.Parallel tasks)
List.map (fun x -> fib(x)) [1..30];;
map' (fun x -> fib(x)) [1..30];;
Еще один стиль обработки данных:
реактивное функциональное
программирование / Events
let x = new TwitterStreamSample(…)
x.NewFeed
|> Event.map (fun x -> JsonConvert.DeserializeObject<tweet>(x))
|> Event.filter (fun x -> x.lang="en")
|> Event.map (fun x-> MoodAnalyzer.ComputeWeight x.text)
|> Event.scan (fun (p,n) (px,nx) -> (p+px,n+nx)) (0,0)
|> Event.map (fun (p,n) -> p-n) |> FSharpChart.FastLine
x.StartListening()

Event<t>
Как такое сделать
type TwitterStreamSample(token,secret) =
let event = new Event<_>()
let listener =
async {
let req = WebRequest.Create(streamSampleUrl) // more OAUTH magic
use! resp = req.AsyncGetResponse()
use stream = resp.GetResponseStream()
use reader = new StreamReader(stream)
while ((not reader.EndOfStream)&&(not IsCancellationRequested)) do
let z = reader.ReadLine()
post (fun () -> event.Trigger text) // в вызывающий поток
}
member this.StartListening() = Async.Start(listener)
member this.StopListening() = Async.CancelDefaultToken()
member this.NewFeed = event.Publish
Другие похожие примеры
NUI-контроллеры Kinect, Leap Motion – выдают

информацию по кадрам, 30fps

type LeapMotion() =
let event = new Event<_>()
let cntr = new Leap.Controller()
let rec loop = async {
let f = cntr.Frame()
post (fun()->event.Trigger(f))
do! Async.Sleep(50)
if (not IsCancellationRequested) then return! loop
}
member this.EventFeed = event.Publish
member this.Start() = Async.Start loop
member this.Stop() = Async.CancelDefaultToken()
Использование в реальной жизни
Совместный проект Российского государственного университета физической культуры, спорта,

молодёжи и туризма и лаборатории MAILabs
Оценка показателей здоровья и физического развития детей при помощи Kinect
Мораль:
List |> List.map (fun x->x*2) |> List.filter (fun x -> x>0)
Sequence |> Seq.map (fun x->x*2) |> Seq.filter (fun x -> x>0)
EventSource|> Event.map (fun x->x*2) |> Event.filter (fun x -> x>0)
|> Event.add (fun x-> …)
F# - высокодекларативный язык
При одинаковом синтаксисе процесс вычисления может сильно отличаться
Это позволяет эффективно обрабатывать большие данные
В том числе в модели реактивного программирования
При этом:
F# есть на облаке Windows Azure
F# есть на клиенте (Kinect, Leap Motion)
F# - open source
F# имеет сильное сообщество (http://fsharp.org)
F# почти не проприетарный
F# используется на практике (даже в России)
F# используется в преподавании в вузах России
(НИУ ВШЭ, СПбГУ, НГУ, МАИ, …)
F# - прекрасен!
Используйте F#!

Дмитрий Сошников
dmitri@soshnikov.com
facebook.com/shwars
twitter.com/shwars
vk.com/shwars
blog.soshnikov.com

More Related Content

What's hot

Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptEugene Tataurov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Pythondudarev
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAYury Novozhilov
 
ITCrowd - Метапрограммирование
ITCrowd - МетапрограммированиеITCrowd - Метапрограммирование
ITCrowd - МетапрограммированиеITCrowd Almaty
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Mikhail Kurnosov
 

What's hot (10)

Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScript
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Python
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNA
 
ITCrowd - Метапрограммирование
ITCrowd - МетапрограммированиеITCrowd - Метапрограммирование
ITCrowd - Метапрограммирование
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 

Viewers also liked

Машинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterМашинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterRoman Nevolin
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Увлекательный мир программирования.
Увлекательный мир программирования.Увлекательный мир программирования.
Увлекательный мир программирования.Dmitri Soshnikov
 
Машинное обучение для школьников
Машинное обучение для школьниковМашинное обучение для школьников
Машинное обучение для школьниковDmitri Soshnikov
 
reactive dotNet
reactive dotNetreactive dotNet
reactive dotNet0xffAA
 
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
 
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
 
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrackБаг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrackAlexander Byndyu
 
Большие возможности для маленькой компании
Большие возможности для маленькой компанииБольшие возможности для маленькой компании
Большие возможности для маленькой компанииAlexander Byndyu
 
Шаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решенияШаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решенияAlexander Byndyu
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаAlexander Byndyu
 
Impact Mapping на практике v2
Impact Mapping на практике v2Impact Mapping на практике v2
Impact Mapping на практике v2Alexander Byndyu
 
Машинное обучение на платформе .NET
Машинное обучение на платформе .NETМашинное обучение на платформе .NET
Машинное обучение на платформе .NETRoman Nevolin
 
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 Теория и практика .NET-бенчмаркинга (25.01.2017, Москва) Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)Andrey Akinshin
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметикуAndrey Akinshin
 

Viewers also liked (19)

Машинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterМашинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 Piter
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Tpl DataFlow
Tpl DataFlowTpl DataFlow
Tpl DataFlow
 
Увлекательный мир программирования.
Увлекательный мир программирования.Увлекательный мир программирования.
Увлекательный мир программирования.
 
Машинное обучение для школьников
Машинное обучение для школьниковМашинное обучение для школьников
Машинное обучение для школьников
 
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 в реальном проекте
 
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
 
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrackБаг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
Баг-трекер по-новому: что и почему JetBrains изменил в последней версии YouTrack
 
Час Кода 2015
Час Кода 2015Час Кода 2015
Час Кода 2015
 
Большие возможности для маленькой компании
Большие возможности для маленькой компанииБольшие возможности для маленькой компании
Большие возможности для маленькой компании
 
Шаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решенияШаблоны интеграции - актуальные инструменты и решения
Шаблоны интеграции - актуальные инструменты и решения
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продукта
 
Impact Mapping на практике v2
Impact Mapping на практике v2Impact Mapping на практике v2
Impact Mapping на практике v2
 
Машинное обучение на платформе .NET
Машинное обучение на платформе .NETМашинное обучение на платформе .NET
Машинное обучение на платформе .NET
 
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 Теория и практика .NET-бенчмаркинга (25.01.2017, Москва) Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
 
Поговорим про арифметику
Поговорим про арифметикуПоговорим про арифметику
Поговорим про арифметику
 

Similar to SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сенсоров Kinect и Leap Motion

Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Sergey Tihon
 
производящие функции(продолжение)
производящие функции(продолжение)производящие функции(продолжение)
производящие функции(продолжение)Mariya_Lastochkina
 
Функциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевФункциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевAleksander Alekseev
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Боремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуБоремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуAgile Base Camp
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow SeptemberAlexander Zimin
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 

Similar to SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сенсоров Kinect и Leap Motion (20)

Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
производящие функции(продолжение)
производящие функции(продолжение)производящие функции(продолжение)
производящие функции(продолжение)
 
Функциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевФункциональное программирование - Александр Алексеев
Функциональное программирование - Александр Алексеев
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Боремся со сложностью по-функциональному
Боремся со сложностью по-функциональномуБоремся со сложностью по-функциональному
Боремся со сложностью по-функциональному
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
лекция 3
лекция 3лекция 3
лекция 3
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow September
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 

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.
 

SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сенсоров Kinect и Leap Motion

  • 1. Девятая независимая научно-практическая конференция «Разработка ПО 2013» 23 - 25 октября, Москва F# и обработка потоковых данных Дмитрий Сошников dmitri@soshnikov.com | twitter.com/shwars Майкрософт | НИУ ВШЭ | МАИ
  • 3. Сегодня я впервые не буду рассказывать про F# как язык
  • 4. TIOBE Programming Language Index F# - #24 Common Lisp - #34 Scheme - #35 Scala - #36 Prolog - #38 Erlang - #43 Haskell - #46
  • 5. Введение и разминка мозга Вычисление факториала на F# Очевидно let rec fact n = if n=1 then 1 else n*fact(n-1) Симпатично let rec fact = function | 1 -> 1 | n -> n*fact(n-1) Эффективно let fact = let rec fact' acc = function | 1 -> acc | n -> fact' (n*acc) (n-1) fact' 1 Эффективно let fact = let rec fact' f = function | 1 -> f 1 | n -> fact' (f>>((*)n)) (n-1) fact' (fun x->x) Во всех случаях – без побочных эффектов
  • 6. Введение и дальнейшая разминка мозга Вычисление факториала на F# Коротко Каррировано Лениво По т-ме Тарского Извращеннокомбинаторно let fact n = [1..n] |> List.reduce (*) let fact = (..) 1 >> Seq.reduce (*) let fact n = Seq.initInfinite (fun x->x+1) |> Seq.scan (*) 1 |> Seq.nth n let rec fix f x = f (fix f) x let fact = fix (fun f x -> if x=1 then 1 else x*f(x-1)) let s f g x = f x (g x) let k x y = x let b f g x = f (g x) let c f g x = f x g let rec y f x = f (y f) x let cond p f g x = if p x then f x else g x let pred x = x-1 let fact = y (b (cond ((=) 0) (k 1)) (b (s (*)) (c b pred))) Во всех случаях – без побочных эффектов
  • 7. Конкурс: До конца лекции придумайте еще один способ вычисления факториала и получите конфетку!
  • 8. Обработка данных: списки map reduce fold filter [1..10] |> List.map (fun x->x*x) [1..10] |> List.map (fun x->x*x) |> List.reduce (+) [1..10] |> List.map (fun x->x*x) |> List.fold (+) 0 [1..10] |> List.filter (fun x-> x%3=0) f
  • 9. Пример Какое минимальное число Фибоначчи делится на 256? open System.Numerics let fib (n : BigInteger) = let rec fib' n max u v acc = if n>max then acc else fib' (n+1I) max (u+v) u (u::acc) List.rev (fib' 0I n 1I 1I []) fib 200I |> List.filter (fun x->x%256I=0I) |> List.head let rec find u v = if (u%256I=0I) then u else find (u+v) u find 1I 1I
  • 10. Обработка данных: последовательности map reduce fold filter {1..10} |> Seq.map (fun x->x*x) {1..10} |> Seq.map (fun x->x*x) |> Seq.reduce (+) {1..10} |> Seq.map (fun x->x*x) |> Seq.fold (+) 0 {1..10} |> Seq.filter (fun x-> x%3=0) nextElement() f(nextElement())
  • 11. Пример Какое минимальное число Фибоначчи делится на 256? Seq.unfold (fun (u,v) -> Some(u,(u+v,u))) (1I,1I) |> Seq.filter(fun x->x%256I=0I) |> Seq.head Здесь мы имеем дело с бесконечной последовательностью чисел Фибоначчи! Математики могут быть счастливы!
  • 12. Практический пример: мера доброты ReadLines @"c:bookswap_1.txt" |> Seq.fold (fun (name,mood,result) x -> if x.Contains("CHAPTER") then (x,0,(name,mood)::result) else let (p,n) = MoodAnalyzer.ComputeWeight x (name,mood+p-n,result)) ("",0,[]) |> fun (n,m,res) -> (n,m)::res |> List.filter (fun (x,y) -> x<>””) |> FSharpChart.Bar let ReadMap fn wt = ReadLines fn |> Seq.map (fun x-> x.Trim()) |> Seq.fold (fun map x -> Map.add x wt map) Map.empty let Positive = ReadMap @"positive.txt" 1 let Negative = ReadMap @"negative.txt" -1 let wt x map = if Map.containsKey x map then Map.find x map else 0 let ComputeWeight (s : string) = s.Split([|' ';';';',';'!';'(';')'|]) |> Array.fold (fun (p,n) x -> (p+wt x Positive,n-wt x Negative)) (0,0)
  • 13. Вывод: Война и Мир – добрый роман! (по крайней мере в переводе на английский)
  • 14. Экскурс: параллельная и асинхронная обработка let task1 = async { return 10+10 } let task2 = async { return 20+20 } Async.Run (Async.Parallel [ task1; task2 ]) let map' func items = let tasks = seq { for i in items -> async { return (func i) } } Async.RunSynchronously (Async.Parallel tasks) List.map (fun x -> fib(x)) [1..30];; map' (fun x -> fib(x)) [1..30];;
  • 15. Еще один стиль обработки данных: реактивное функциональное программирование / Events let x = new TwitterStreamSample(…) x.NewFeed |> Event.map (fun x -> JsonConvert.DeserializeObject<tweet>(x)) |> Event.filter (fun x -> x.lang="en") |> Event.map (fun x-> MoodAnalyzer.ComputeWeight x.text) |> Event.scan (fun (p,n) (px,nx) -> (p+px,n+nx)) (0,0) |> Event.map (fun (p,n) -> p-n) |> FSharpChart.FastLine x.StartListening() Event<t>
  • 16. Как такое сделать type TwitterStreamSample(token,secret) = let event = new Event<_>() let listener = async { let req = WebRequest.Create(streamSampleUrl) // more OAUTH magic use! resp = req.AsyncGetResponse() use stream = resp.GetResponseStream() use reader = new StreamReader(stream) while ((not reader.EndOfStream)&&(not IsCancellationRequested)) do let z = reader.ReadLine() post (fun () -> event.Trigger text) // в вызывающий поток } member this.StartListening() = Async.Start(listener) member this.StopListening() = Async.CancelDefaultToken() member this.NewFeed = event.Publish
  • 17. Другие похожие примеры NUI-контроллеры Kinect, Leap Motion – выдают информацию по кадрам, 30fps type LeapMotion() = let event = new Event<_>() let cntr = new Leap.Controller() let rec loop = async { let f = cntr.Frame() post (fun()->event.Trigger(f)) do! Async.Sleep(50) if (not IsCancellationRequested) then return! loop } member this.EventFeed = event.Publish member this.Start() = Async.Start loop member this.Stop() = Async.CancelDefaultToken()
  • 18. Использование в реальной жизни Совместный проект Российского государственного университета физической культуры, спорта, молодёжи и туризма и лаборатории MAILabs Оценка показателей здоровья и физического развития детей при помощи Kinect
  • 19. Мораль: List |> List.map (fun x->x*2) |> List.filter (fun x -> x>0) Sequence |> Seq.map (fun x->x*2) |> Seq.filter (fun x -> x>0) EventSource|> Event.map (fun x->x*2) |> Event.filter (fun x -> x>0) |> Event.add (fun x-> …) F# - высокодекларативный язык При одинаковом синтаксисе процесс вычисления может сильно отличаться Это позволяет эффективно обрабатывать большие данные В том числе в модели реактивного программирования
  • 20. При этом: F# есть на облаке Windows Azure F# есть на клиенте (Kinect, Leap Motion) F# - open source F# имеет сильное сообщество (http://fsharp.org) F# почти не проприетарный F# используется на практике (даже в России) F# используется в преподавании в вузах России (НИУ ВШЭ, СПбГУ, НГУ, МАИ, …) F# - прекрасен!