F# 3.0 Information Rich Programming
description
Transcript of F# 3.0 Information Rich Programming
КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ
F# 3.0 Information Rich Programming
Артем Присяжнюкhttp://www.host-tracker.comТехнический директор
О чем мы будем говорить?•Введение в 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<degs>)
Простой кодРабота с данными
Tuple<U,T> Swap<T,U>(Tuple<T,U> t){ return new 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); }
C#
Простой кодРабота с данными
Tuple<U,T> Swap<T,U>(Tuple<T,U> t){ return new 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); }
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 + WPFType Providers – не только данные!
Полное дерево XAML
Итого• Можем безопасно работать с
несколькими источниками данных используя Type Providers
• Доступ к разнородным источникам данных с помощью унифицированного интерфейса
• F# отлично работает для программной логики
Переносимые библиотеки• Одна библиотека – любая
платформа. Silverlight, Metro.
Что дальше?• Облака, облака, облака• Azure• С помощью Computation expressions
можно расширять язык:– async { … }, query { … }, seq { … } – это не
фича языка. Это библиотеки которые расширяют язык с помощью Computation expressions
– ждем cloud { … }
Спасибо
Вопросы[email protected]