Мне интересно иметь что-то очень похожее на библиотеку флагов Google для Haskell.
Вот небольшое введение в gflags, которое демонстрирует, почему я люблю его: http://gflags.googlecode.com/svn/trunk/doc/gflags.html
Я просмотрел различные getopt-подобные библиотеки на Hackage и не нашел ни одной, которая соответствовала бы простоте и гибкости gflags.
А именно, я хотел бы иметь эти функции:
- генерирует --help (со значениями по умолчанию, указанными в справке),
- помимо синтаксического анализа параметров, предоставленных пользователем, он также должен ошибаться в несопоставленных параметрах, чтобы у пользователя была возможность отметить опечатки,
- флаги могут быть легко объявлены в любом модуле (надеюсь, на верхнем уровне, хакерство Template Haskell приемлемо, если это необходимо),
- нет необходимости в main вызывать все модули, где я объявил флаги, вместо этого флаги каким-то образом регистрируются при запуске/связывании/в любое время,
- it's OK if main has to call a general initialization function, like in gflags'
google::ParseCommandLineFlags(&argc, &argv, true);
- флаги можно использовать чисто (да, я думаю, что это подходящее использование unsafePerformIO для упрощения API).
После безуспешных поисков я поиграл с идеей сделать это сам (и, конечно же, поделиться этим на Hackage). Однако у меня нет абсолютно никакого представления о реализации регистрационной части. Мне нужно что-то похожее на атрибут GCC ((constructor)) или на статическую инициализацию C++, но в Haskell. Стандартного unsafePerformIO верхнего уровня недостаточно, потому что это лениво, поэтому он не будет вызываться до того, как main начнет работать.