Я только что узнал о библиотеке Boost Phoenix (скрытой в проекте Spirit) и как фанат стиля функционального программирования (но все еще любитель; немного опыта с haskell и схемой), я хотел поиграть с этим библиотека, чтобы узнать о разумных применениях этой библиотеки.
Помимо увеличения выразительности и ясности кода с использованием стиля fp, я особенно заинтересован в ленивой оценке для ускорения вычислений при низких затратах.
Небольшой и простой пример будет следующим:
Существует некоторая проблема маршрутизации (например, TSP), которая использует евклидову матрицу расстояний. Мы предполагаем, что некоторые значения матрицы расстояний никогда не используются, а некоторые используются очень часто (поэтому не стоит вычислять их на лету для каждого вызова). Теперь представляется разумным иметь ленивую структуру данных , содержащую значения расстояния. Как это было бы возможно с Фениксом? (игнорируя тот факт, что я легко справился бы без программирования в стиле fp) Чтение официальной документации Phoenix не позволило мне понять достаточно, чтобы ответить на этот вопрос.
Возможно ли это вообще? (в Haskell, например, в основе языка лежит способность создавать thunks, которые гарантируют, что значение может быть вычислено позже).
Что означает использование вектора со всеми ленивыми функциями, определенными в Фениксе? Как бы я ни был наивен, я попытался заполнить две матрицы (вектор>) случайными значениями, одну с обычным push_back, другую с boost :: phoenix :: push_back, и попытался прочитать только небольшое количество значений из этих матриц и хранить их в контейнере для распечатки. Ленивый был всегда пуст. Я неправильно использую феникс / это должно быть возможно? Или я неправильно понял функцию контейнеров / алгоритмов в Фениксе. Небольшая подсказка для последнего - наличие специальной библиотеки list-data-Structure в библиотеке FP ++, которая повлияла на Phoenix.
Дополнительно:
- Для чего вы используете Феникс?
- Знаете ли вы хорошие источники информации о Фениксе? (учебные пособия, записи в блогах ...)
Спасибо за ваш вклад!