Девятая независимая
научно-практическая конференция
«Разработка ПО 2013»
23 - 25 октября, Москва

F# и обработка потоковых...
Сегодня особенное
выступление
Сегодня я
впервые не буду
рассказывать про
F# как язык
TIOBE Programming Language Index

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

Очевидно

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

Симпатич...
Введение и дальнейшая разминка мозга
Вычисление факториала на F#

Коротко
Каррировано
Лениво
По т-ме Тарского
Извращенноко...
Конкурс:
До конца лекции придумайте
еще один способ вычисления
факториала и получите
конфетку!
Обработка данных: списки
map
reduce
fold
filter

[1..10] |> List.map (fun x->x*x)
[1..10] |> List.map (fun x->x*x) |> List...
Пример
Какое минимальное число Фибоначчи делится на

256?

open System.Numerics
let fib (n : BigInteger) =
let rec fib' n...
Обработка данных: последовательности
map
reduce
fold
filter

{1..10} |> Seq.map (fun x->x*x)
{1..10} |> Seq.map (fun x->x*...
Пример
Какое минимальное число Фибоначчи делится на

256?

Seq.unfold (fun (u,v) -> Some(u,(u+v,u))) (1I,1I)
|> Seq.filte...
Практический пример: мера доброты
ReadLines @"c:bookswap_1.txt"
|> Seq.fold (fun (name,mood,result) x ->
if x.Contains("CH...
Вывод:

Война и Мир – добрый роман!
(по крайней мере в переводе на английский)
Экскурс:
параллельная и асинхронная обработка
let task1 = async { return 10+10 }
let task2 = async { return 20+20 }
Async....
Еще один стиль обработки данных:
реактивное функциональное
программирование / Events
let x = new TwitterStreamSample(…)
x....
Как такое сделать
type TwitterStreamSample(token,secret) =
let event = new Event<_>()
let listener =
async {
let req = Web...
Другие похожие примеры
NUI-контроллеры Kinect, Leap Motion – выдают

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

type LeapMotion() =
let...
Использование в реальной жизни
Совместный проект Российского государственного университета физической культуры, спорта,

...
Мораль:
List |> List.map (fun x->x*2) |> List.filter (fun x -> x>0)
Sequence |> Seq.map (fun x->x*2) |> Seq.filter (fun x ...
При этом:
F# есть на облаке Windows Azure
F# есть на клиенте (Kinect, Leap Motion)
F# - open source
F# имеет сильное сообщ...
Используйте F#!

Дмитрий Сошников
dmitri@soshnikov.com
facebook.com/shwars
twitter.com/shwars
vk.com/shwars
blog.soshnikov...
Upcoming SlideShare
Loading in …5
×

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

548 views

Published on

Published in: Health & Medicine
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
548
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Девятая независимая научно-практическая конференция «Разработка ПО 2013» 23 - 25 октября, Москва F# и обработка потоковых данных Дмитрий Сошников dmitri@soshnikov.com | twitter.com/shwars Майкрософт | НИУ ВШЭ | МАИ
  2. 2. Сегодня особенное выступление
  3. 3. Сегодня я впервые не буду рассказывать про F# как язык
  4. 4. TIOBE Programming Language Index F# - #24 Common Lisp - #34 Scheme - #35 Scala - #36 Prolog - #38 Erlang - #43 Haskell - #46
  5. 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. 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. 7. Конкурс: До конца лекции придумайте еще один способ вычисления факториала и получите конфетку!
  8. 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. 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. 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. 11. Пример Какое минимальное число Фибоначчи делится на 256? Seq.unfold (fun (u,v) -> Some(u,(u+v,u))) (1I,1I) |> Seq.filter(fun x->x%256I=0I) |> Seq.head Здесь мы имеем дело с бесконечной последовательностью чисел Фибоначчи! Математики могут быть счастливы!
  12. 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. 13. Вывод: Война и Мир – добрый роман! (по крайней мере в переводе на английский)
  14. 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. 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. 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. 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. 18. Использование в реальной жизни Совместный проект Российского государственного университета физической культуры, спорта, молодёжи и туризма и лаборатории MAILabs Оценка показателей здоровья и физического развития детей при помощи Kinect
  19. 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. 20. При этом: F# есть на облаке Windows Azure F# есть на клиенте (Kinect, Leap Motion) F# - open source F# имеет сильное сообщество (http://fsharp.org) F# почти не проприетарный F# используется на практике (даже в России) F# используется в преподавании в вузах России (НИУ ВШЭ, СПбГУ, НГУ, МАИ, …) F# - прекрасен!
  21. 21. Используйте F#! Дмитрий Сошников dmitri@soshnikov.com facebook.com/shwars twitter.com/shwars vk.com/shwars blog.soshnikov.com

×