250 likes | 381 Views
Артем Присяжнюк http://www.host-tracker.com Технический директор. F# 3.0 Information Rich Programming. О чем мы будем говорить?. Введение в F# Язык для решения повседневных проблем F# TypeProviders Будущее развитие.
E N D
Артем Присяжнюк http://www.host-tracker.com Технический директор F# 3.0Information Rich Programming
О чем мы будем говорить? Введение в F# Язык для решения повседневных проблем F# TypeProviders Будущее развитие
F# - функциональный язык, ориентированный на решение проблем реального мира, позволяет решать сложные задачи с помощью простого кода
Простой кодФункции как значения C# abstractclassCommand{ publicvirtualvoid Execute(); } abstractclassRoverCommand: Command { protected Rover Rover { get; privateset; } publicRoverCommand(MarsRover rover){ this.Rover = rover; } } classBrakeCommand: RoverCommand{ publicBrakeCommand(Rover rover): base(rover) { } publicoverridevoid Execute(){ Rover.Accelerate(-1.0); } } classTurnLeftCommand: RoverCommand{ publicTurnLeftCommand(Rover rover): base(rover) {} publicoverridevoid Execute(){ Rover.Rotate(-5.0); } } type Command = Rover -> unit letBrakeCommand = fun rover ->rover.Accelerate(-1.0) letTurnLeftCommand = fun rover ->rover.Rotate(-5.0<degs>) F#
Простой кодРабота с данными C# Tuple<U,T> Swap<T,U>(Tuple<T,U> t) { returnnewTuple<U,T>(t.Item2, t.Item1) } ReadOnlyCollection<Tuple<T,T,T>> Rotations<T> (Tuple<T,T,T> t) { newReadOnlyCollection<int> (newTuple<T,T,T>[] { newTuple<T,T,T>(t.Item1,t.Item2,t.Item3); newTuple<T,T,T>(t.Item3,t.Item1,t.Item2); newTuple<T,T,T>(t.Item2,t.Item3,t.Item1); }); } int Reduce<T>(Func<T,int> f,Tuple<T,T,T> t) { return f(t.Item1) + f(t.Item2) + f (t.Item3); }
Простой кодРабота с данными C# Tuple<U,T> Swap<T,U>(Tuple<T,U> t) { returnnew Tuple<U,T>(t.Item2, t.Item1) } ReadOnlyCollection<Tuple<T,T,T>> Rotations<T> (Tuple<T,T,T> t) { new ReadOnlyCollection<int> (new Tuple<T,T,T>[] { new Tuple<T,T,T>(t.Item1,t.Item2,t.Item3); new Tuple<T,T,T>(t.Item3,t.Item1,t.Item2); new Tuple<T,T,T>(t.Item2,t.Item3,t.Item1); }); } int Reduce<T>(Func<T,int> f,Tuple<T,T,T> t) { return f(t.Item1) + f(t.Item2) + f (t.Item3); } let swap (x, y) = (y, x) let rotations (x, y, z) = [ (x, y, z); (z, x, y); (y, z, x) ] let reduce f (x, y, z) = f x + f y + f z F#
DEMO Работа с последовательностями
F# и немного математики List.map2 (-) x y |> List.map square |> List.map2 (*) weights |> List.sum |> sqrt
Дилемма • Мы живем в информационно богатой среде • Но языки не имеют развитой инфраструктуры для работы с данными
Проблемы • Статическая типизация и внешние источники данных • Ручная интеграция генерации кода с процессом сборки, контроля версия и т.д. • Нет элегантного пути отражать изменения в схеме данных
С другой стороны… • Источники данных часто предоставляют хорошее описания схем данных • Статическая типизация должна помогать, а не мешать в работе
TypeProviders Встроенные Сторонние Regex FileSystem Csv Excel JSON XML Registry XAML AppSettings Дальше больше… • SqlDataConnection • SqlEntityConnection • ODataService • WsdlService
Демо 2 TypeProvidersи работа с внешними источниками данных
Что получается? • Можем работать с структурированными онлайн источниками данных • Нет кодогенерации! • Имеем статическую проверку типов! • Можем определить изменения схемы • Поддержка инструментов Visual Studio и IntelliSense!
Демо 3 F# + TypeProviders + WPF TypeProviders – не только данные!
Итого • Можем безопасно работать с несколькими источниками данных используя Type Providers • Доступ к разнородным источникам данных с помощью унифицированного интерфейса • F# отлично работает для программной логики
Переносимые библиотеки • Одна библиотека – любая платформа. Silverlight, Metro.
Что дальше? • Облака, облака, облака • Azure • С помощью Computation expressions можно расширять язык: • async{ … },query { … }, seq { … } – это не фича языка. Это библиотеки которые расширяют язык с помощью Computation expressions • ждем cloud { … }
Спасибо Вопросы? a.p@host-tracker.com