Один из «продвинутого» отдела: программирование с фантомными типами (иногда также называемыми индексированными типами). По общему признанию, это не «стандартная» техника в функциональном программировании, но и не совсем эзотерическая, и это то, что заставляет ваш мозг работать некоторое время (вы просили что-то сложное, верно?;)).
В двух словах, речь идет о параметризации типов для кодирования и статического применения определенных свойств во время компиляции. Одним из стандартных примеров является функция сложения векторов, которая статически гарантирует, что заданные два вектора длины N и M вернут вектор длины N + M, иначе вы получите ошибку времени компиляции. Да, есть более интересные приложения.
Эти методы не так полезны в C ++, как в надлежащем функциональном языке программирования, но до сих пор мне удавалось пробовать некоторые из этих вещей во всех моих недавних проектах на работе в разной степени, совсем недавно в контексте C ++ EDSL, где это сработало очень хорошо. Вам не обязательно кодировать причудливые вещи, изучение этого помогло мне обнаружить ситуации, когда несколько тегов типа могут уменьшить многословность EDSL или разрешить, например, более чистый синтаксис.
По общему признанию, полезность несколько ограничена языковой поддержкой и тем, чего вы пытаетесь достичь.
Некоторые закуски:
Общий и индексированный тип (слайды с кратким обзором приложений)
Приколы с фантомными типами
Документ Кеннеди и Руссо, упомянутый на слайдах: Обобщенные алгебраические типы данных
и объектно-ориентированное программирование и помещает некоторые из этих вещей в контекст C # / Java.
Глава 3 в книге Дэйва Абрахама Метапрограммирование шаблона C ++ - , доступное онлайн как пример главы , и использует эти методы в C ++ для анализа измерений.
Практическим проектом FP с использованием фантомных типов является HaskellDB.