Могу ли я создать расширяемое (через дополнительные пользовательские плагины) приложение на Haskell?

Я изучаю Хаскелл.

Когда я писал свои приложения на С#, я сделал это расширяемым. То есть его можно расширить за счет загрузки дополнительных пользовательских DLL файлов (плагинов или расширений - это одно и то же). Мое управляемое приложение через механизм Reflection находит необходимые классы и методы по их некоторым атрибутам и регистрирует их в общем реестре команд моего приложения. Но я могу это сделать, потому что .NET Framework имеет технологию Reflection. Поэтому я могу расширить функциональность базы моего приложения, не перекомпилируя его.

Могу ли я создать приложение Extensible (через дополнительные пользовательские плагины) на Haskell? Имеет ли Haskell механизм похож на Reflection на .NET Framework? Или, может быть, существует другой способ сделать то же самое в Haskell.

Ответ 1

Существует библиотека GHC для динамической загрузки plugins. Существует также некоторая поддержка своего рода интроспекции, но это на самом деле не путь Haskell.

Вместо этого вы можете добавить функцию register-plugin предопределенного типа к каждому плагину, а затем вызвать эту функцию при загрузке плагина. Функция, являющаяся частью плагина, может иметь как можно больше знаний о плагине и не нуждается в интроспекции. Основной код не должен знать ничего о плагине рядом с типом register-function.

Обратите внимание, что это работает и на других языках без интроспекции, например, в C.

Ответ 2

Я предполагаю, что это может не сработать для вас, [XMonad] [1] использует другой подход. Файл конфигурации является исходным файлом Haskell; когда вы меняете конфигурацию и просите перезагрузить, она перекомпилируется и перезапускается. (Он в основном бесшовный).

[1]: http://xmonad.org/ XMonad