cpprussia C++ Russia 2019 (19.04.2019)

Монадические парсеры

img

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

«Зачем нужны эти ваши монады?» — такой вопрос звучит в сообществе C++ разработчиков с завидной частотой. Традиционно приводятся примеры монадического использования таких типов, как std::optional, std::future и std::expected, но список наиболее используемых монад в мире функционального программирования значительно шире. Вот какие есть монады в Haskell: Maybe (std::optional), Either (std::expected), IO, State, Reader, STM, Par (std::future). Не слишком полезно пытаться понять, что такое абстрактная монада и как она работает. Лучше предварительно изучить, как пользоваться конкретными монадами, какие задачи они решают, и из этого знания вынести базовую интуицию, справедливую для любых монад.

В докладе будут рассмотрены монадические парсеры: чем этот подход отличается от других видов парсинга (комбинаторные парсеры а-ля Boost::Spirit, парсер-генераторы, ad hoc-решения вроде парсящих конечных автоматов и т. д.), какие у него преимущества и недостатки и в чем здесь проявляются такие важные концепции функционального программирования, как функтор, аппликативный функтор и монада.