我寫在Haskell模塊化和可擴展的文本編輯器,我想實現這樣的插件:插件的作者提供了一個單一的功能,看起來是這樣的:如何處理我的類型中的用戶插件?
handleEvent :: (PluginState, EditorState) -> Event -> (PluginState, EditorState)
由於每個事件都會發生,插件可以使用當前編輯器狀態和自己狀態的自定義塊來計算新的編輯器狀態和新的插件狀態。當然,每個插件都會爲插件狀態設置不同的類型,所以我會陷入困境,不知道如何以通用的方式將它集成到我的系統中。
我怎麼能寫的東西隱約這樣的:
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