Подтвердить что ты не робот

Функциональные шаблоны проектирования

Существует множество функциональных идиом: монады, аппликации, стрелки и т.д. Они задокументированы в разных статьях, но, к сожалению, я не знаю ни одной книги или статьи, где они суммируются в одном месте (есть Typeclassopedia, но в нем много областей, которые не покрыты хорошо). Может ли кто-нибудь рекомендовать статью/книгу, которая хорошо их охватывает в одном месте и которая может быть доступна программисту с промежуточными навыками в FP?

4b9b3361

Ответ 1

Мое предложение, если вы хотите узнать Scala, прочитать книгу от Пола Чиусано и Рунара Бьярнасона:

http://manning.com/bjarnason/

Часть II: библиотеки функционального дизайна и комбинаторов

  1. Создание небольших языков
  2. Сериализация JSON
  3. Тестирование на основе спецификации
  4. Parsers
  5. Чисто функциональный parallelism
  6. Чисто функциональное состояние

Часть III: Функциональные шаблоны проектирования

  • Случай для абстракции
  • Моноиды
  • Функторы
  • Монады
  • Аппликативные функторы
  • Трассируемые и складывающиеся структуры данных
  • Comonads

Часть IV: Нарушение правил: эффекты и ввод-вывод

  • Эффекты против побочных эффектов
  • Обработка потока и инкрементный ввод-вывод
  • Обеспечение контроля эффекта с помощью системы типов

Ответ 2

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

Довольно распространенная схема заключается в построении монадных трансформаторов вместо простых монадов (см. также ссылку в следующем параграфе). Это в основном означает, что вы строите что-то, что должно сочетаться с другими монадами, в результате чего более сложный способ может обрабатывать функции обоих из них.

В Real World Haskell есть несколько глав о монадах. В Глава 14. Монады авторы объясняют основы и некоторые общие обычаи (возможно, список, состояние). Глава 15. Программирование с монадами дает больше объяснений о том, как эффективно их использовать (оно также охватывает монаду читателя). В следующей главе объясняется, как использовать Parsec, но может быть интереснее искать статьи, описывающие, как это работает: должно быть действительно хороший пример хорошо организованного использования монадов для синтаксического разбора. Fianlly, Глава 18. Трансформаторы Monad описывают, как работают монадные трансформаторы, а затем показывает, как их построить, шаг за шагом. Интересны также соображения, касающиеся заключительных разделов главы.

Я прочитал один раз действительно интересный вопрос о SO о творческом использовании монадов. Предлагаемые ссылки были потрясающими чтениями по этой теме. С этим духом я попытался задать то же самое для arrows: у меня определенно было меньше ответов, чем у монадов, но, тем не менее, интересных.


Что касается шаблонов ООП бандой из четырех человек, есть хороший набор из 3 статей IBM по теме в их серии Функциональное мышление. Целевой функциональный язык Scala. Они объясняют обычные шаблоны проектирования в ООП и показывают, как они отображаются в Scala.

Самая важная статья w.r.t. ваш вопрос наверняка первый, но два других могут быть интересными связанными чтениями тем не менее.

Ответ 3

У Джереми Гиббонса Шаблоны в блоге FP, которому суждено в конечном итоге стать в значительной степени той книгой, о которой вы просите. Конечно, это еще не в состоянии быть таким же полезным, каким вы могли бы хотеть только сейчас, но он заслуживает некоторой поддержки!

Между тем, я скажу +1 для Brent Yorgey Typeclassopedia. Это действительно полезно, и если есть более поздние части, которые путают, этот сайт является хорошим местом, чтобы добраться до них. Я знаю, что Брент держит его под контролем. Если он не дойдет до своих читателей, помогите ему.

Ответ 5

Прочитали ли вы более поздние главы Узнаете ли вы о Haskell для большого блага?

  • В главе 6 рассматриваются карты и складки, которые являются двумя наиболее важными "шаблонами проектирования" в функциональных языках.

  • Главы 11-13 охватывают Функторы, Аппликативные Функторы и Монады в этом порядке. Это полезно - во многих учебниках представлены функции "Фунтеры", а затем "Монады", а затем добавляются аппликативные функторы в конце (если они вообще его покрывают). Порядок в LYAH лучше, потому что переход от Functors = > Applicative Functors = > Monads перемещает вас постепенно вверх по лестнице общности и мощности.

  • Глава 14 охватывает молнии - вы можете эффективно воспринимать их как классы контейнеров с указателем на конкретную часть данных, что означает, что вы получаете доступ и обновление O (1) в месте расположения указателя.

Он не охватывает стрелки или Comonads, которые являются более продвинутой темой в Haskell. Чтобы понять, как и почему использовать Arrows или Comonads, у вас обязательно должно быть твердое понимание Monads, поэтому я не думаю, что это проблема. LYAH прочно нацелена на новичок на рынке Haskell.