"Зачем учить f# и как начать: парсим интернет...

51
Зачем учить F# и как начать Андрей Чебукин The Secret Circle Solutions [email protected] linkedin.com/in/xperiandri fb.com/xperiandri vk.com/xperiandri

Upload: fwdays

Post on 15-Apr-2017

656 views

Category:

Technology


3 download

TRANSCRIPT

Зачем учить F# и как начатьАндрей ЧебукинThe Secret Circle Solutions

[email protected]/in/xperiandrifb.com/xperiandrivk.com/xperiandri

План• Функциональное программирование• Синтаксис F#• Работа с данными• Парсер HTML• Что дальше?

Функциональное программирование

Императивный против функциональногоМеняем состояние• Запись входных данных

в память• Вычисление• Запись результатов в

память• Основной оператор -

присвоение

Применяем функции• Применение функций

ко выходным данным• Передача результатов

или функций на вход другим функциям

• Нет присвоения

Присваивание Связывание с именем

• Переменной x присвоить значение 5

• Значению 5 дать имя x

Всё есть функция (1st class citizen)

Прозрачность ссылок (Referential Transparency)

Каррирование функции (Curry)преобразование функции от многих аргументов в функцию, берущую свои аргументы по одному

Частичное применение (partial application)

Функции высших порядков (higher order)

Истинные функции (однозначные, pure)

Строгое и нестрогое (ленивое) вычислениеЧто будет если?

Специальные типы данных• Неизменяемые

(immutable)• Со специальным

синтаксисом для создания частично изменённой копии

• С функциями высших порядков

Итоги• Всё есть функция• Функция высшего порядка – принимает другую функцию

параметром• Прозрачность ссылок – всегда известно единое значение• Истинные (однозначные) функции – результат всегда одинаков

для одинаковых входных параметров• Вывод типов – компилятор обычно сам выведет все типы• Нет присвоения – используем рекурсию и связывание с

именем• Специальные типы – типы работающие без присвоения

Язык F#

Примитивные типы данныхbool Booleanbyte Bytesbyte SByteint16 Int16uint16 UInt16int Int32uint32 UInt32int64 Int64uint64 UInt64

nativeint IntPtrunativeint UIntPtrchar Charstring Stringdecimal Decimalunit not applicablevoid Voidfloat32, single Singlefloat, double Double

unit• Вместо void• ()

Кортеж (tuple)

Необязательный тип (optional type)

Запись (record)

Неизменяемый типЛегко создать копию с изменением некоторых значенийВстроенное сравнение по значению

Размеченное объединение (discriminated union)

Сопоставление с образцом (pattern matching)

Активный шаблон (active pattern)

Как функция проверки возвращающая необязательный тип или размеченное объединение

Операторы

Единицы измерения

Вычислительные выражения (computation)

Вычислительные выражения (computation)

Коллекции

Коллекции: поискC# F#

Single exactlyOne, pick

SingleOrDefault tryPick

All, TrueForAll forall, forall2

Any, Exists exists, exists2

Contains contains

ElementAt item, nth

ElementAtOrDefault tryItem

C# F#

Find find, tryFind

FindIndex findIndex, tryFindIndex

FindLast findBack, tryFindBack

FindLastIndexfindIndexBack, tryFindIndexBack

First, Last head, last

FirstOrDefault tryHead

IndexOf, LastIndexOf нет

LastOrDefault tryLast

КоллекцииПроекция, сортировка, групп.C# F#

ConvertAllmap, map2, map3, mapi, mapi2

ForEach iteri, iteri2Select Seq.map

через Select pairwiseнет indexedOrderBy sortBy, sortWith, sort

OrderByDescendingsortByDescending, sortDescending

Reverse Rev

GroupBy groupBy

GroupJoin нет

ФильтрацияC# F#

Distinct distinct, distinctBy

FindAll filter

GetRange нет

OfType через pick

Skip skip

SkipWhile skipWhile

Take take

TakeWhile takeWhile

Where Seq.where

Select + Where chooseSkip(1) tail

КоллекцииАггрегацияC# F#

Aggregate

fold, fold2, foldBack, foldBack2, mapFold, mapFold2, reduce, reduceBack, scan, scanBack

Average averageBy, average

Max max, maxBy

Min min, minBy

Sum sum, sumBy

нет permute

ПреобразованиеC# F#

AsEnumerable toSeq

AsParallel нет

AsQueryble нет

AsReadOnly уже такой

Cast через map

CopyTo toArray

ToArray toArray

ToList Нет

ToDictionary Map.ofList

ToLookup нет

КоллекцииСлияние, и множественноеC# F#

Concat append

Except except, Set.difference

Intersect Set.intersect

Join нет

Union Set.union

Zip zip, zip3

SelectMany нет

нет Set.intersectMany

нет Set.unionMany

нет concat

Разделение, инициализацияC# F#

нет unzip, unzip3нет Windowedнет partitionнет splitIntoнет splitAtнет unfoldнет initEnumerable.Empty emptyEnumerable.Repeat replicateнет singletone

Как потреблять данные?

Метаданные• WSDL• Swagger• Схема из базы данных

А если схема изменилась?

Руками что ли???

Поставщики типов (type providers)

Всегда актуальная схема данныхПроверка в момент компиляции того, что обычно вываливается в момент выполнения

Поставщики в наличииВстроенные• SqlDataConnection• SqlEntityConnection• ODataService• WsdlService

Сторонние• Regex• FileSystem• Csv• Excel• JSON• XML

• Swagger• Registry• XAML• AppSettings• И другие…

ДемоПарсер

Visual F# Power Tools

F# snippet

F# Interactive Intellisense

Другие• F# Outlining – сворачивание функций• FSharpTest – шаблон проекта модульных тестов

Что дальше…

Функциональное программирование на F#

Дмитрий Сошников2011

F# for fun and profit

Scott Wlaschinhttp://fsharpforfunandprofit.com/

F# Deep Dives

Tomas PetricekPhil Trelford

Помимо .NET Native F# всё более активно используется в Microsoft. Мы в процессе внедрения F# в .NET Core. Мы замечаем, что команды внутри Microsoft используют, а стартапы внедряют F# активнее

Попробуйте уже сегодня!