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

106

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

Константин Соломатов
источник
Он не дает прямого ответа на ваш вопрос, но этот другой вопрос содержит некоторую интересную информацию (и, по крайней мере, ссылку или две): stackoverflow.com/questions/327955/…
reuben 05
15
Не могли бы вы подробнее остановиться на тех областях, которые, по вашему мнению, не охватывает Типеклассопедия?
dave4420 05
2
@ dave4420 Если я читаю классопедию типов от начала до конца, чем больше я читаю, тем меньше понимаю. Первые разделы действительно хороши, но вторые разделы мне трудно читать.
Константин Соломатов
3
@KonstantinSolomatov, возможно, вам придется исследовать разделы, которые вы не понимаете, просматривать сообщения в блогах и внимательно изучать код. все эти «шаблоны проектирования» в классопедии типов на самом деле являются абстракциями, и часто глубокими, и иногда требуется время, чтобы в них погрузиться.
jberryman 05
1
@DanBurton не уверен, что вы неправильно прочитали мой комментарий, но я бы отнес все это к категории глубоких абстракций, хотя легко забыть об этом, когда у вас есть «А-ха!» момент.
jberryman 06

Ответы:

35

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

http://manning.com/bjarnason/

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

  1. Делаем маленькие языки
  2. Сериализация JSON
  3. Тестирование на основе спецификации
  4. Парсеры
  5. Чисто функциональный параллелизм
  6. Чисто функциональное состояние

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

  1. Причина абстракции
  2. Моноиды
  3. Функторы
  4. Монады
  5. Аппликативные функторы
  6. Проходимые и складываемые структуры данных
  7. Комонады

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

  1. Эффекты против побочных эффектов
  2. Потоковая обработка и инкрементный ввод-вывод
  3. Обеспечение области действия эффекта с помощью системы типов
Эдмондо, 1984
источник
31

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

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

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

Однажды я прочитал действительно интересный вопрос по SO о творческом использовании монад . Предложенные ссылки были отличным чтением по этой теме. В этом духе я попытался попросить то же самое о стрелах : ответов определенно меньше, чем о монадах, но тем не менее интересных.


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

  1. Функциональное мышление: функциональные шаблоны проектирования, часть 1 . Здесь они охватывают фабрики, методы шаблонов, стратегию, легковес. Суть в том, что с функциями как первоклассными значениями все становится намного проще.
  2. Функциональное мышление: функциональные шаблоны проектирования, часть 2 . Это про Java и Groovy . Он обращается к шаблону адаптера.
  3. Функциональное мышление: функциональные шаблоны проектирования, часть 3 . Здесь они говорят о шаблоне интерпретатора. Опять же, целевой язык отличный.

Самая релевантная статья по вашему вопросу - это, конечно, первая, но две другие, тем не менее, могут быть интересными связанными чтениями.

Риккардо Т.
источник
Спасибо, но я имею в виду разные типы шаблонов, такие как шаблоны Monad, Arrow, Applicative no GoF.
Константин Соломатов
@KonstantinSolomatov: Я неправильно понял ваш вопрос, извините. Я добавил несколько ссылок на монады и стрелки.
Riccardo T.
18

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

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

свинарник
источник
5

Вы читали более поздние главы « Learn You a Haskell for Great Good» ?

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

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

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

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

Крис Тейлор
источник
1
Да, я прочитал книгу. Мне это очень понравилось. К сожалению, он не скрывает стрелки и многие другие сложные шаблоны. Я также хочу узнать больше о монадах и аппликативах (например, LYHGG не охватывает монад продолжения).
Константин Соломатов