среда, 15 декабря 2010 г.

Книга Криса Смита «Программирование на языке F#»

ProgrammingFSharp

Любая методология разработки, инструмент, технология или язык программирования привлекает к себе внимание по разным причинам. Это может быть нечто инновационное и тогда по прошествию десятка или двух лет (!), до него таки дотянутся руки всего остального компьютерного сообщества. Так было практически со всеми идеями, которым пришлось пройти длительный путь от конференций гиков до признания широкой общественностью. Другим способом ворваться в «мейнстрим» является поддержка уже известного вендора, например такого, как компания … Майкрософт. Большинство людей инерционны и не будут вкладывать свои силы в «нонейм» инструменты, пока не удостоверятся, что их капиталовложение будет востребовано. Если же инструментом занимается подобный вендор, то риск изучить что-то, что не пригодится в будущем, очень не велик.

На самом деле такое мнение весьма близоруко, поскольку при изучении нового инструмента, языка или технологии вы развиваетесь, узнаете что-то новое и включая способности применять эти подходы в другом контексте. Это особенно справедливо, когда речь касается новых парадигм программирования, таких как функциональное программирование, которое само по себе не привязано к конкретному языку или технологии.

Если говорить о книге Криса Смита «Программирование на языке F#» (Chris Smith “Programming F#”), то в ней можно выделить несколько составляющих. Во-первых, в ней рассказывается о функциональных «фишках», таких как функции первого рода, неизменяемость, сопоставление с образцом (a.k.a. pattern matching), размеченные объединения (discriminated unions), отложенные вычисления, каррирование функций, мемоизация и т.д. Во-вторых, это некоторые функциональные возможности специфичные для языка F#, такие как вычислительные выражения (computation expressions), генерация списков и последовательностей (list comprehensions и sequence comprehensions), асинхронные выражения (async workflow) и др. Третьей составляющей является тема мультипарадигменного программирования в языке F#, в которой автор рассматривает изменяемость, императивное и объектно-ориентированное программирование. Эта тема тесно связана с межъязыковым взаимодействием, которое сводится к использованию из языка F# объектно-ориентированных библиотек, таких как BCL, а также использованию сборок, полученных на языке F# в объектно-ориентированном окружении.

Мне кажется, что книга будет наиболее полезна читателям уже знакомым с объектно-ориентированным программированием и программированием на платформе .Net, поскольку именно эти темы в книге раскрыты весьма слабо (а неточности в объектной терминологии просто напрягают). Но это не является серьезной проблемой, поскольку книг, посвященных платформе .Net и языку C# достаточно много и попытаться переплюнуть Рихтера или Скита и втиснуть в несколько глав то, чему другие авторы посвящают книги – мало реально. Но с другой стороны, «функциональная сторона» описана достаточно неплохо и информации будет вполне достаточно, чтобы читатель начал применять полученные знания на практике. А поскольку многие современные разработчики как раз таки обладают знаниями в ООП и языке C# и посматривают в сторону функционального программирования, то эта книга будет именно тем, что нужно.

З.Ы. Да, кстати, эта книга уже очень скоро должна появиться на русском языке. Я не знаю точной даты выхода, но поскольку я закончил ее редактирование пару недель назад, то речь, в любом случае, идет о неделях, а не о месяцах.

3 комментария:

  1. "функции первого рода" скорее всего это от "functions as a firtst-order types" или что-то в этом роде. Там, кажется, это как-то связанно с λ-исчислением. Я не уверен, но мне это представляется так, что все объекты - это функции, но некоторые из них не раскрываются (конструкторы), а работа ведется с ними и/или с их аргументами. Т.е. всё множество возможных констант состоит только из функций с разным количеством аргументов.

    ОтветитьУдалить
  2. Функции первого порядка, а не первого рода.
    Это действительно лямбда-исчисление.
    Связано с возможностью использовать функции в качестве аргумента другой функции и/или возврата в качестве значения функции.

    ОтветитьУдалить
  3. Да, использование функции в качестве аргумента другой функции - это "higher-order function" и без функций как объектов данных - это невозможно. Я же имел ввиду, что как в λ-исчислении данные могут быть представлены как-то иначе ( wiki). К примеру в GHC все данные имеют "конструкторы", которые по сути являются функциями и при упомянутом здесь pattern-matching'е указываются эти конструкторы. Т.е. на уровне языка - примитивных типов нет, а работа ведется с типами, объекты которых представлены функциями примененными к каким-то абстрактным данным, которые выходят за рамки языка.

    ОтветитьУдалить