Функциональное программирование на F#
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Автор:
Сошников Дмитрий Валерьевич
Год издания: 2017
Кол-во страниц: 192
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-97060-534-9
Артикул: 616253.02.99
Автор этой книги имеет богатый опыт преподавания курсов функционального программирования на базе F# в ведущих российских университетах, в то же время, будучи технологическим евангелистом Майкрософт, он умеет доходчиво объяснить концепции функционального программирования даже начинающему разработчику ПО, не прибегая к сложным понятиям лямбда-исчисления. Книга содержит много полезных примеров использования F# для решения практических задач: доступа к реляционным или слабоструктурированным XML-данным, использование F# для веб-разработки и веб-майнинга, визуализация данных и построение диаграмм, написание сервисов для облачных вычислений и асинхронных приложений для Windows Phone 7. Используя фрагменты кода, рассмотренные в книге, читатели могут немедленно приступить к решению своих практических задач на F#.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Функциональный стиль позволяет программисту выразить свои мысли более структурированно и лаконично. С появлением языка программирования F# и включения его в состав Visual Studio 2010 эти возможности открываются перед огромным числом разработчиков. Эта книга поможет вам освоить базовые концепции языка и погрузиться в мир функционального программирования в среде .NET, а благодаря легкому и непринужденному изложению этот процесс будет увлекательным и интересным. Сергей Звездин, Microsoft Regional Director, Южно-Уральский государственный университет, Челябинск Эта книга подобна колесу обозрения - неспешное движение поднимает читателя от азов функционального программирования к обзору мира программирования во всей его полноте, включая организацию асинхронных процессов и конструирование компиляторов. Отличительной особенностью книги является ее практичность. Без погружения в теоретические аспекты и языковые тонкости автор показывает технику функционального программирования и ее взаимодействие с другими парадигмами программирования в рамках языка F#. Л. В. Городняя, кандидат физ.-мат. наук, доцент, Старший научный сотрудник Института систем информатики СО РАН, Новосибирск Менее чем на 200 страницах эта книга даёт обзор основных концепций функционального программирования, а также демонстрирует практические примеры использования F# для решения широкого круга задач, от анализа текстов до создания игр и веб-приложений. Томаш Петричек, University of Cambridge, автор книги “F#: Functional Programming for the Real World” Учебник известного специалиста Д.В.Сошникова открывает новый мир функционального программирования на F#. В мирах, представленных в этой книге, встречаются бесконечно красивые фракталы, облачные вычисления, параллельное программирование и много другое. Продуманный стиль изложения делает эту книгу доступной для понимания, но в тоже время приучает к профессиональному мышлению. Помимо изложения теоретических основ в книге много внимания уделяется практической реализации программ на F# с использованием самых современных технологий таких как Silverlight и WP7. Р. В. Шамин, кандидат физ.-мат. наук, старший научный сотрудник Института океанологии РАН доцент Российского университета дружбы народов Я ничего не понимаю в программировании, но получаю огромное удовольствие от изучения языка F#. Студентка, пожелавшая остаться неназванной Чтение и выполнение примеров из книги доставляет настоящее удовольствие. Язык F# должен пополнить копилку знаний каждого разработчика, который хочет быть в курсе последних тенденций на платформе .NET. Прочтение этой книги позволяет иначе взглянуть на решение множества возникающих проблем в корпоративном программировании. Юрий Трухин, ведущий разработчик ООО «ЦНИП ГИС», Microsoft Student Partner, Тверской государственный технический университет Не могу с радостью не отметить появление ещё одной книги по функциональному программированию на русском языке, причём не переводной, а, что называется, аутентичной. На этот раз книга рассматривает многие аспекты ФП на языке F#, входящего в семейство ML. В связи с этим имеется желание выразить почтение как автору, так и издательству ДМК Пресс, за которым уже прочно закрепилось реноме популяризатора функциональной парадигмы в России. Пусть расцветает сто цветов. Р. В. Душкин, автор книг о функциональном языке программирования Haskell Нет одной для всех дороги к овладению секретами современного программирования, но есть маршруты, которые можно рекомендовать разным людям. Так вот, книга Дмитрия Сошникова «Функциональное программирование на F#» - это маршрут, который можно рекомендовать начинающим программистам для целенаправленного изучения понятий, методов и приемов программирования на функциональном языке, а так же знатокам функционального программирования для знакомства технологиями .NET с использованием привычной парадигмы. Н. В. Шилов, кандидат физ.-мат.наук, доцент, Старший научный сотрудник Института систем информатики СО РАН, Новосибирск
Сошников Д. В. Функциональное программирование на F# Москва, 2017
УДК 004.438F# ББК 32.973.26-018.1 С54 Сошников Д. В. С54 Функциональное программирование на F#. – М.: ДМК Пресс, 2017. – 192 с.: ил. ISBN 978-5-97060-534-9 Автор этой книги имеет богатый опыт преподавания курсов функцио нального программирования на базе F# в ведущих российских университетах, в то же время, будучи технологическим евангелистом Майкрософт, он умеет доходчиво объяснить концепции функционального программирования даже начинающему разработчику ПО, не прибегая к сложным понятиям лямбда-исчисления. Книга содержит много полезных примеров использования F# для реше ния практических задач: доступа к реляционным или слабоструктурированным XML-данным, использование F# для веб-разработки и веб-майнинга, визуализация данных и построение диаграмм, написание сервисов для облачных вычислений и асинхронных приложений для Windows Phone 7. Используя фрагменты кода, рассмотренные в книге, читатели могут немедленно приступить к решению своих практических задач на F#. УДК 004.438F# ББК 32.973.26-018.1 Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. © Сошников Д. В. ISBN 978-5-97060-534-9 © Оформление, издание, ДМК Пресс, 2017
Содержание Предисловие Дона Сайма ...................................................................... 6 Предисловие автора .................................................................................. 8 0. Введение ................................................................................................... 10 0.1. Зачем изучать функциональное программирование ................................... 10 0.2. О чем и для кого эта книга ........................................................................... 12 0.3. Как установить и начать использовать F# ................................................... 13 1. Основы функционального программирования .................. 17 1.1. Применение функций vs. Присваивание ..................................................... 17 1.2. Упорядоченные кортежи, списки и вывод типов .......................................... 19 1.3. Функциональные типы и описание функций ................................................ 20 1.4. Каррирование ............................................................................................. 22 1.5. Условный оператор и опциональный тип ..................................................... 23 1.6. Типы данных, размеченное объединение и сопоставление с образцом ...... 25 1.7. Рекурсия, функции-параметры и цикл for ................................................... 27 1.8. Конструкции >>, |> ..................................................................................... 28 1.9. Пример – построение множества Мандельброта ........................................ 29 1.10. Интероперабельность с .NET .................................................................... 31 2. Рекурсивные структуры данных ................................................. 34 2.1. Списки и конструкторы списков ................................................................. 34 2.2. Сопоставление с образцом......................................................................... 35 2.3. Простейшие функции обработки списков ................................................... 36 2.4. Функции высших порядков ......................................................................... 37 2.4.1. Отображение ...................................................................................... 37 2.4.2. Фильтрация ........................................................................................ 39 2.4.3. Свертка .............................................................................................. 41 2.4.4. Другие функции высших порядков ...................................................... 43 2.5. Генераторы списков .................................................................................... 44 2.6. Хвостовая рекурсия .................................................................................... 45 2.7. Сложностные особенности работы со списками ......................................... 47 2.8. Массивы ..................................................................................................... 50 2.9. Многомерные массивы и матрицы .............................................................. 52 2.9.1. Списки списков, или непрямоугольные массивы (Jаgged Arrays) ........ 52 2.9.2. Многомерные массивы .NET ............................................................... 53 2.9.3. Специализированные типы для матриц и векторов ............................. 54 2.9.4. Разреженные матрицы........................................................................ 55
Содержание 2.9.5. Использование сторонних математических пакетов ........................... 56 2.10. Деревья общего вида ................................................................................ 56 2.11. Двоичные деревья .................................................................................... 59 2.11.1. Определение .................................................................................... 59 2.11.2. Обход двоичных деревьев ................................................................. 59 2.11.3. Деревья поиска ................................................................................. 60 2.11.4. Деревья выражений и абстрактные синтаксические деревья (AST) ... 62 2.12. Другие структуры данных .......................................................................... 63 2.12.1. Множества (Set) ................................................................................ 63 2.12.2. Отображения (Map) ........................................................................... 63 2.12.3. Хеш-таблицы .................................................................................... 64 3. Типовые приемы функционального программирования .................................................................................. 66 3.1. Замыкания .................................................................................................. 66 3.2. Динамическое связывание и mutable-переменные ..................................... 67 3.3. Генераторы и ссылочные переменные ref .................................................... 68 3.4. Ленивые последовательности (seq) ............................................................ 71 3.4.1. Построение частотного словаря текстового файла ............................. 73 3.4.2. Вычисление числа π методом Монте-Карло ........................................ 74 3.5. Ленивые и энергичные вычисления ............................................................ 76 3.6. Мемоизация ............................................................................................... 79 3.7. Продолжения .............................................................................................. 81 4. Императивные и объектно-ориентированные возможности F# ......................................................................................... 84 4.1. Мультипарадигмальность языка F# ............................................................ 84 4.2. Элементы императивного программирования на F# ................................... 85 4.2.1. Использование изменяемых переменных и ссылок ............................. 85 4.2.2. Цикл с предусловием .......................................................................... 86 4.2.3. Условный оператор ............................................................................. 87 4.2.4. Null-значения ...................................................................................... 87 4.2.5. Обработка исключительных ситуаций ................................................. 87 4.3. Объектно-ориентированное программирование на F# ............................... 89 4.3.1. Записи ................................................................................................ 89 4.3.2. Моделирование объектной ориентированности через записи и замыкания ................................................................................................ 90 4.3.3. Методы ............................................................................................... 91 4.3.4. Интерфейсы ....................................................................................... 92 4.3.5. Создание классов с помощью делегирования .................................... 93 4.3.6. Создание иерархии классов ............................................................... 94 4.3.7. Расширение функциональности имеющихся классов ......................... 97 4.3.8. Модули ............................................................................................... 97 5. Метапрограммирование ................................................................. 99 5.1. Языково-ориентированное программирование ......................................... 99 5.2. Активные шаблоны ....................................................................................102 5.3. Квотирование ............................................................................................103
Содержание 5.4. Конструирование выражений, частичное применение функции и суперкомпиляция ..........................................................................................106 5.5. Монады .....................................................................................................107 5.5.1. Монада ввода-вывода .......................................................................108 5.5.2. Монадические свойства ....................................................................110 5.5.3. Монада недетерминированных вычислений ......................................111 5.6. Монадические выражения .........................................................................112 6. Параллельное и асинхронное программирование ........115 6.1. Асинхронные выражения и параллельное программирование ...................115 6.2. Асинхронное программирование ...............................................................116 6.3. Асинхронно-параллельная обработка файлов ...........................................118 6.4. Агентный паттерн проектирования ............................................................120 6.5. Использование MPI....................................................................................122 7. Решение типовых задач .................................................................127 7.1. Вычислительные задачи ............................................................................127 7.1.1. Вычисления с высокой точностью ......................................................127 7.1.2. Комплексный тип ...............................................................................128 7.1.3. Единицы измерения...........................................................................128 7.1.4. Использование сторонних математических пакетов ..........................129 7.2. Доступ к данным ........................................................................................131 7.2.1. Доступ к реляционным базам данных (SQL Server) .............................131 7.2.2. Доступ к слабоструктурированным данным XML ................................136 7.2.3. Работа с данными в Microsoft Excel ....................................................139 7.3. Веб-программирование ............................................................................143 7.3.1. Доступ к веб-сервисам, XML-данным, RSS-потокам ..........................144 7.3.2. Доступ к текстовому содержимому веб-страниц ................................144 7.3.3. Использование веб-ориентированных программных интерфейсов на примере Bing Search API .........................................................................147 7.3.4. Реализация веб-приложений на F# для ASP.NET Web Forms ...............148 7.3.5. Реализация веб-приложений на F# для ASP.NET MVC ........................150 7.3.6. Реализация веб-приложений на F# при помощи системы WebSharper .................................................................................................152 7.3.7. Облачное программирование на F# для Windows Azure ......................156 7.4. Визуализация и работа с графикой ............................................................158 7.4.1. Двухмерная графика на основе Windows Forms API ............................159 7.4.2. Использование элемента Chart ..........................................................160 7.4.3. 3D-визуализация с помощью DirectX и/или XNA .................................164 7.5. Анализ текстов и построение компиляторов ..............................................171 7.4.1. Реализация синтаксического разбора методом рекурсивного спуска .........................................................................................................171 7.4.2. Использование fslex и fsyacc ..............................................................174 7.5. Создание F#-приложений для Silverlight и Windows Phone 7 .......................179 Вместо заключения .................................................................................185 Рекомендуемая литература ..............................................................190
Предисловие Дона Сайма F# является достаточно молодым языком программирования – его разработку мы начали в MicrosoftResearch в Кембридже 7 лет назад. С тех пор язык стал богатым и выразительным инструментом индустриального программирования, использующимся в различных областях, в особенности после того, как он был включен в стандартную поставку VisualStudio 2010. В прошлом году мне довелось выступать с несколькими виртуальными докла дами на конференциях по разработке ПО в России, и я убедился, что здесь есть значительный интерес к F#, как среди разработчиков ПО, так и в кругу любителей функционального программирования. Поэтому мне особенно приятно, что Дмитрий взял на себя тяжелый труд по написанию первой русскоязычной книги по F#. F# – это интересный язык, поскольку он является не только эффективным инструментом для разработки коммерческого ПО на платформе .NET, но и очень удобным академическим языком для преподавания функционального программирования в университетах (использование для этой цели в качестве базового языка, который имеет индустриальную поддержку, имеет много преимуществ), а также исследовательским языком (на самом деле многие идеи для следующего поколения .NET-языков приходят из F#, взять хотя бы асинхронные блоки, агенты и типо-образующие классы). Дмитрий Сошников, автор этой книги, имеет богатый опыт преподавания курсов функционального программирования на базе F# в ведущих российских университетах, в то же время, будучи технологическим евангелистом Майкрософт, он умеет доходчиво объяснить концепции функционального программирования даже начинающему разработчику ПО, не прибегая к сложным понятиям лямбда-исчисления. Эта книга в первую очередь ориентирована на практикующих программистов, которые найдут в ней хорошее введение в функциональное программирование. Затем в книге следует более глубокое изложение приемов функционального программирования, полезные главы по объектно-ориентированному, асинхронному и параллельному программированию на F#. Книга также содержит много полезных примеров использования F# для решения практических задач: доступа к реляционным или слабоструктурированным XML-данным, использование F# для вебразработки (как на ASP.NETWebForms/MVC, так и с применением WebSharper) и веб-майнинга, визуализация данных и построение диаграмм, написание сервисов для облачных вычислений и асинхронных приложений для WindowsPhone 7. Используя фрагменты кода, рассмотренные в книге (а также доступные для скачивания со странички автора из Интернет), читатели могут немедленно приступить к решению своих практических задач на F#.
Предисловие Дона Саймона Я искренне надеюсь, что эта книга поможет раскрыть красоту, богатство и мощь языка F# для многих разработчиков ПО из России и других русско-говорящих стран. Дон Сайм, ведущий исследователь, MicrosoftResearch Cambridge, создатель языка F#
Предисловие автора Решение взяться за написание книги по F# было очень непростым. Во-первых, не было понятно, насколько такая книга будет востребована. Во-вторых, сложно конкурировать с уже появившейся полудюжиной англоязычных книг по этому языку. И наконец, написание книги – это очень трудоемкий процесс, учитывая, что он является далеко не единственным делом моей жизни. Однако, встречаясь со многими студентами и разработчиками и выступая в вузах, я понял, что интерес к языку огромен, а необходимость в русскоязычных книгах имеется, поскольку не все начинающие изучать программирование хорошо владеют английским языком, – а хотелось показать прелести функционального программирования не только профессионалам, но и всем. Поэтому в какой-то момент решение было принято, а результатом стало то, что вы держите в руках. Тем не менее мне не хотелось дублировать существующие англоязычные кни ги. Основной целью было создать небольшую книгу, которая позволит практикующим программистам и начинающим за короткий срок овладеть как основами функционального программирования, так и базовым синтаксисом языка F#. Для удобства в книге сначала рассматриваются базовые понятия, которые позволят вам быстро (после прочтения первых трех глав) начать писать на F# весьма нетривиальные программы и понимать чужой код. Последняя, седьмая глава содержит в себе множество коротких и лаконичных примеров и фрагментов кода, многие из которых вы можете использовать с минимальными изменениями для решения своих задач. Таким образом, после прочтения книги вы не только «расширите свое сознание», изучив еще один подход к программированию, но и пополните свой арсенал чрезвычайно мощным средством для решения различных задач обработки данных. Создание этой книги было бы невозможно без участия многих моих друзей и коллег. Первоначальный интерес к функциональному программированию появился у меня в результате бесед с профессором В. Э. Вольфенгагеном и другими моими знакомыми и коллегами из «кибернетической школы» МИФИ, в частности А. В. Гавриловым и С. В. Зыковым; в дальнейшем он был подкреплен знакомством с Саймоном Пейтоном-Джонсом, одним из создателей языка Haskell, ныне работающим в Microsoft Research в Кембридже. После того как благодаря в первую очередь усилиям Дона Сайма F# был включен в состав Visual Studio 2010, я стал более плотно заниматься вопросами продвижения функционального программирования в обучение в рамках своих обязанностей как технологического евангелиста Майкрософт. Я хотел бы поблагодарить коллег из Новосибирска (ИСИ СО РАН, НГУ и НГТУ): А. Г. Марчука, Л. И. Городнюю и Н. В. Шилова за
Предисловие автора плодотворную дискуссию на тему использования F# для преподавания в рамках семинара ИСИ СО РАН, окончательно убедившую меня в том, что F# может помочь решить благую задачу внедрения в учебный процесс курсов функционального программирования, которые при этом будут иметь значительную практическую направленность. Мне посчастливилось поставить и прочитать такие курсы на базе F# в ве дущих московских вузах: МФТИ и ГУ ВШЭ – за эту возможность я благодарен В. Е. Кривцову и С. М. Авдошину. Многие материалы книги основаны на этих курсах, которые я вел совместно с С. Лаптевым и С. В. Косиковым. Некоторые примеры были разработаны студентами Т. Абаевым (ГУ ВШЭ), А. Брагиным (МАИ), А. Мыльцевым (МФТИ). Благодаря заинтересованности и поддержке А. В. Шкреда видеокурс доступен в рамках интернет-университета информационных технологий ИНТУИТ.РУ. За идею и за возможность издать книгу по языку F# я благодарен Д. А. Мов чану и сотрудникам «ДМК Пресс», причастным к подготовке книги. Я также благодарен моим друзьям и коллегам: С. Звездину (ЮУрГУ), В. Юневу, Ю. Трухину (ТвГТУ), которые любезно согласились прочитать рукопись и высказать свои пожелания и дополнения. Многие вопросы о целесообразности издания такой книги мы обсуждали с В. Е. Зайцевым (МАИ), а проблемы изложения основ функционального подхода – с моим другом Р. В. Шаминым (РУДН). Мне очень важна была также идеологическая поддержка создателя языка F# Дона Сайма (Microsoft Research Cambridge), который любезно согласился написать предисловие. Наконец, хочу поблагодарить мою дочь Вики, которая регулярно терпеливо недополучала внимание отца, уходящее на написание этой книги. Очень хотел бы надеяться, что потраченные на книгу усилия того стоят и помогут зародить любовь к функциональному программированию и к языку F# в сердцах многих начинающих и уже профессионально практикующих разработчиков и архитекторов.