КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ
F# 3.0 Information Rich Programming Артем Присяжнюк Технический директор
О чем мы будем говорить? Введение в F# Язык для решения повседневных проблем F# TypeProviders Будущее развитие
F# - функциональный язык, ориентированный на решение проблем реального мира, позволяет решать сложные задачи с помощью простого кода
Простой код
Простой код Функции как значения abstract class Command { public virtual void Execute(); } abstract class RoverCommand : Command { protected Rover Rover { get; private set; } public RoverCommand(MarsRover rover) { this.Rover = rover; } class BrakeCommand : RoverCommand { public BrakeCommand(Rover rover) : base(rover) { } public override void Execute() { Rover.Accelerate(-1.0); } class TurnLeftCommand : RoverCommand { public TurnLeftCommand(Rover rover) : base(rover) { } public override void Execute() { Rover.Rotate(-5.0); } C# F# type Command = Rover -> unit let BrakeCommand = fun rover -> rover.Accelerate(-1.0) let TurnLeftCommand = fun rover -> rover.Rotate(-5.0 )
Простой код Работа с данными Tuple Swap (Tuple t) { return new Tuple (t.Item2, t.Item1) } ReadOnlyCollection > Rotations (Tuple t) { new ReadOnlyCollection (new Tuple [] { new Tuple (t.Item1,t.Item2,t.Item3); new Tuple (t.Item3,t.Item1,t.Item2); new Tuple (t.Item2,t.Item3,t.Item1); }); } int Reduce (Func f,Tuple t) { return f(t.Item1) + f(t.Item2) + f (t.Item3); } C#
Простой код Работа с данными Tuple Swap (Tuple t) { return new Tuple (t.Item2, t.Item1) } ReadOnlyCollection > Rotations (Tuple t) { new ReadOnlyCollection (new Tuple [] { new Tuple (t.Item1,t.Item2,t.Item3); new Tuple (t.Item3,t.Item1,t.Item2); new Tuple (t.Item2,t.Item3,t.Item1); }); } int Reduce (Func f,Tuple t) { return f(t.Item1) + f(t.Item2) + f (t.Item3); } C# F# 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
DEMO Работа с последовательностями
F# и немного математики List.map2 (-) x y |> List.map square |> List.map2 (*) weights |> List.sum |> sqrt
F# 3.0 Information Rich Programming
Почему важно? Программирование в сети
Дилемма Мы живем в информационно богатой среде Но языки не имеют развитой инфраструктуры для работы с данными
Проблемы Статическая типизация и внешние источники данных Ручная интеграция генерации кода с процессом сборки, контроля версия и т.д. Нет элегантного пути отражать изменения в схеме данных
С другой стороны… Источники данных часто предоставляют хорошее описания схем данных Статическая типизация должна помогать, а не мешать в работе
Ответ – F# Type Providers
TypeProviders Встроенные SqlDataConnection SqlEntityConnection ODataService WsdlService Сторонние Regex FileSystem Csv Excel JSON XML Registry XAML AppSettings Дальше больше…
Демо 2 TypeProviders и работа с внешними источниками данных
Что получается? Можем работать с структурированными онлайн источниками данных –Нет кодогенерации! Имеем статическую проверку типов! –Можем определить изменения схемы Поддержка инструментов Visual Studio и IntelliSense!
Демо 3 F# + Type Providers + WPF Type Providers – не только данные!
Полное дерево XAML
Итого Можем безопасно работать с несколькими источниками данных используя Type Providers Доступ к разнородным источникам данных с помощью унифицированного интерфейса F# отлично работает для программной логики
Переносимые библиотеки Одна библиотека – любая платформа. Silverlight, Metro.
Что дальше? Облака, облака, облака Azure С помощью Computation expressions можно расширять язык: –async { … }, query { … }, seq { … } – это не фича языка. Это библиотеки которые расширяют язык с помощью Computation expressions –ждем cloud { … }
Спасибо Вопросы?