Языки программирования

Учебник F# для начинающих

21 урок · 6 разделов · бесплатно, без регистрации

F# — функциональный-first язык на платформе .NET: прагматичный потомок ML, который сочетает строгую статическую типизацию с лаконичностью и почти полным отсутствием шаблонного кода. В этом курсе вы освоите идеи функционального программирования на практике — неизменяемость по умолчанию, мощный вывод типов, каррирование и оператор конвейера, сопоставление с образцом, алгебраические типы данных и моделирование домена, безопасную работу с option и Result, асинхронность, а также уникальные фишки F#: единицы измерения, активные шаблоны и type providers.

Курс опирается на ваше знакомство с .NET и сравнивает F# с C# (когда функциональный стиль выгоднее) и с Haskell (прагматизм против чистоты). Код на F# в браузере не исполняется, поэтому примеры сопровождаются точным выводом. К концу курса вы будете писать идиоматичный F# и понимать, почему его выбирают в финансах, в моделировании сложных доменов и в data science.

Курс «F#: функциональное программирование на .NET» состоит из 6 разделов и 21 урока: Знакомство с F# и первые шаги, Типы, функции и конвейеры, Сопоставление с образцом, Алгебраические типы и моделирование домена, Коллекции, рекурсия и обработка ошибок и Асинхронность, .NET и продвинутые возможности. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Знакомство с F# и первые шаги

    1. Что такое F# и зачем он нужен

      F# — функциональный-first язык на .NET: прагматичный ML, лаконичность, статическая типизация и где его применяют на практике.

    2. Установка: .NET SDK, dotnet fsi и скрипты .fsx

      Ставим .NET SDK, запускаем F# Interactive (dotnet fsi), пишем и исполняем скрипты .fsx — рабочее окружение для курса.

    3. Значения и неизменяемость: let и иммутабельность по умолчанию

      let создаёт неизменяемые значения, mutable — исключение. Почему иммутабельность по умолчанию делает код предсказуемым.

  2. 2 Типы, функции и конвейеры

    1. Вывод типов: статика без аннотаций

      Мощный вывод типов в F#: статическая типизация почти без аннотаций, как работает алгоритм и когда тип нужно указать явно.

    2. Функции, каррирование и частичное применение

      Функции в F# каррированы по умолчанию: что это даёт, как работает частичное применение и почему функции — значения.

    3. Конвейер |> и композиция >>

      Оператор конвейера |> и композиция функций >> в F#: как строить читаемые цепочки преобразований данных.

    4. Базовые типы и кортежи

      Базовые типы F# (int, float, bool, string, char, unit) и кортежи для группировки значений без объявления классов.

  3. 3 Сопоставление с образцом

    1. match: основы сопоставления

      Выражение match в F#: как сопоставлять значения с образцами, почему это выражение, а не оператор, и зачем нужна исчерпывающность.

    2. Разбор структур: списки, кортежи, вложенность

      Деструктуризация в pattern matching: разбор кортежей, списков (head::tail), вложенных структур и привязка имён.

    3. Активные шаблоны (active patterns)

      Активные шаблоны F#: расширяем сопоставление с образцом собственной логикой разбора, частичные и параметризованные паттерны.

  4. 4 Алгебраические типы и моделирование домена

    1. Записи (records)

      Записи в F#: именованные неизменяемые структуры данных, копирование с изменением через with, структурное равенство.

    2. Размеченные объединения (discriminated unions)

      Размеченные объединения F#: тип-сумма с несколькими вариантами, моделирование выбора, разбор через match.

    3. option вместо null: безопасность по типам

      Тип option в F#: Some/None вместо null, безопасная работа с отсутствующими значениями, map и defaultValue.

    4. Невозможные состояния — непредставимы

      Главный принцип моделирования домена в F#: проектируем типы так, чтобы недопустимые состояния нельзя было даже создать.

  5. 5 Коллекции, рекурсия и обработка ошибок

    1. Коллекции и их обработка: списки, массивы, seq, map/filter/fold

      Три коллекции F# (список, массив, seq) и ключевые функции их обработки: map, filter, fold в функциональном конвейере.

    2. Рекурсия и хвостовая рекурсия

      Рекурсия в F# через rec, почему обычная рекурсия рискует переполнить стек и как хвостовая рекурсия это решает.

    3. Обработка ошибок: Result и railway-oriented programming

      Тип Result в F#: Ok/Error вместо исключений, цепочки вычислений и railway-oriented programming для безопасной обработки ошибок.

  6. 6 Асинхронность, .NET и продвинутые возможности

    1. Асинхронность: async

      Асинхронность в F# через async и вычислительные выражения: let!, неблокирующие операции и запуск асинхронных задач.

    2. ООП и взаимодействие с .NET

      F# умеет в ООП: классы, интерфейсы, члены типов и прямой доступ к библиотекам C# и всей экосистеме .NET.

    3. Уникальные фишки: единицы измерения и type providers

      Две уникальные возможности F#: единицы измерения (units of measure) и type providers — типобезопасность величин и доступа к данным.

    4. F# против C# и Haskell: когда что выбрать

      Сравнение F# с C# (когда функциональный стиль выгоднее) и с Haskell (прагматизм против чистоты), области применения F#.