Понимание и использование библиотеки Boost Phoenix с упором на ленивую оценку - PullRequest
7 голосов
/ 03 октября 2010

Я только что узнал о библиотеке Boost Phoenix (скрытой в проекте Spirit) и как фанат стиля функционального программирования (но все еще любитель; немного опыта с haskell и схемой), я хотел поиграть с этим библиотека, чтобы узнать о разумных применениях этой библиотеки.

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

Небольшой и простой пример будет следующим: Существует некоторая проблема маршрутизации (например, TSP), которая использует евклидову матрицу расстояний. Мы предполагаем, что некоторые значения матрицы расстояний никогда не используются, а некоторые используются очень часто (поэтому не стоит вычислять их на лету для каждого вызова). Теперь представляется разумным иметь ленивую структуру данных , содержащую значения расстояния. Как это было бы возможно с Фениксом? (игнорируя тот факт, что я легко справился бы без программирования в стиле fp) Чтение официальной документации Phoenix не позволило мне понять достаточно, чтобы ответить на этот вопрос.

Возможно ли это вообще? (в Haskell, например, в основе языка лежит способность создавать thunks, которые гарантируют, что значение может быть вычислено позже).

Что означает использование вектора со всеми ленивыми функциями, определенными в Фениксе? Как бы я ни был наивен, я попытался заполнить две матрицы (вектор>) случайными значениями, одну с обычным push_back, другую с boost :: phoenix :: push_back, и попытался прочитать только небольшое количество значений из этих матриц и хранить их в контейнере для распечатки. Ленивый был всегда пуст. Я неправильно использую феникс / это должно быть возможно? Или я неправильно понял функцию контейнеров / алгоритмов в Фениксе. Небольшая подсказка для последнего - наличие специальной библиотеки list-data-Structure в библиотеке FP ++, которая повлияла на Phoenix.

Дополнительно:

  • Для чего вы используете Феникс?
  • Знаете ли вы хорошие источники информации о Фениксе? (учебные пособия, записи в блогах ...)

Спасибо за ваш вклад!

1 Ответ

4 голосов
/ 04 октября 2010

По запросу мой комментарий (с дополнениями и небольшими модификациями) в качестве ответа ...

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

Я бы посоветовал вам держаться подальше от Феникса надолго. Мне тоже нравится FP, но FP в C ++ даже более уродлив, чем изменчивость в Haskell (они будут на равных, но C ++ уже уродлив, и Haskell, по крайней мере, по мнению Ларри Уолла, самый красивый язык когда-либо;)). Изучайте и используйте FP, и когда вы хорошо разбираетесь в этом и вынуждены использовать C ++, используйте Phoenix. Но для обучения не рекомендуется использовать библиотеку, которая использует совершенно другую парадигму на и без того сложном языке (например, FP в C ++).

...