Я пишу модульный и расширяемый текстовый редактор в Haskell, и я хотел бы реализовать плагин таким образом: Автор плагина предоставляет одну функцию, которая выглядит примерно так:Как я могу обрабатывать пользовательские плагины в своих типах?
handleEvent :: (PluginState, EditorState) -> Event -> (PluginState, EditorState)
As каждое событие происходит, плагин может использовать текущее состояние редактора и настраиваемый кусок своего собственного состояния, чтобы вычислить новое состояние редактора и новое состояние плагина. Конечно, каждый плагин будет иметь другой тип для состояния плагина, поэтому я зацикливаюсь на том, как я могу интегрировать это в свою систему в общем виде.
Как я могу написать что-то смутно, как это:
type Plugin = (PluginState, EditorState) -> Event -> (PluginState, EditorState)
data MyEditor = MyEditor EditorState [Plugin] [PluginState]
Когда PluginState не конкретный тип?
TLDR; Как я могу хранить карту значений с неконкретными типами доступным способом, не выпекая в каждом состоянии плагина плагина в мое глобальное состояние? Я согласен с повторной компиляцией редактора при добавлении нового плагина.
Спасибо! Я действительно застрял на этом:/
Если вам нужно какое-либо разъяснение, пожалуйста, просто спросите!
Отправной точкой для этого является поиск того, как GHC обрабатывает плагины и как Yi обрабатывает конфигурацию. Я думаю, что оба относятся к частичному перекомпиляционному подходу ... – Alec
Звучит как случай для https://hackage.haskell.org/package/vault – Gurkenglas