Ich bin ein modulares und erweiterbares Texteditor in Haskell zu schreiben, und ich mag Plugins so implementieren: Der Autor des Plugins bietet eine einzige Funktion, die etwa wie folgt aussieht:Wie kann ich Benutzer Plugins in meinen Typen behandeln?
handleEvent :: (PluginState, EditorState) -> Event -> (PluginState, EditorState)
Wie Jedes Ereignis tritt auf, wenn das Plug-in den aktuellen Editorstatus und den angepassten Chunk seines eigenen Status verwendet, um einen neuen Editorstatus und einen neuen Status des Plugins zu berechnen. Natürlich wird jedes Plugin einen anderen Typ für den Plugin-Status haben, also bleibe ich dran, wie ich das in meinem System allgemein integrieren kann.
Wie kann ich schreiben vage etwas wie folgt aus:
type Plugin = (PluginState, EditorState) -> Event -> (PluginState, EditorState)
data MyEditor = MyEditor EditorState [Plugin] [PluginState]
Wenn PluginState kein konkreter ist?
TLDR; Wie kann ich eine Karte von Werten mit nicht-konkreten Typen auf eine barrierefreie Art und Weise speichern, ohne den Zustandstyp jedes Plugins in meinen globalen Zustand einzubetten? Ich bin okay, wenn ich den Editor neu kompiliere, wenn ein neues Plugin hinzugefügt wird.
Danke! Ich bin wirklich auf diesem einen fest:/
Wenn Sie irgendeine Erklärung benötigen, bitte nur fragen!
Ein Ausgangspunkt dafür wäre, nachzuschauen, wie GHC Plugins verarbeitet und wie Yi die Konfiguration handhabt. Beide nehmen eine teilweise Neukompilierung Ansatz ich denke ... – Alec
Klingt wie ein Fall für https://hackage.haskell.org/package/vault – Gurkenglas