【发布时间】:2017-04-03 13:30:27
【问题描述】:
我正在用 Haskell 编写一个模块化和可扩展的文本编辑器,我想以这样的方式实现插件:插件的作者提供了一个看起来像这样的单个函数:
handleEvent :: (PluginState, EditorState) -> Event -> (PluginState, EditorState)
随着每个事件的发生,插件可以使用当前的编辑器状态和它自己的状态的自定义块来计算新的编辑器状态和新的插件状态。当然,每个插件都会有不同的插件状态类型,所以我一直在纠结如何以一般方式将它集成到我的系统中。
我怎么能写出这样模糊的东西:
type Plugin = (PluginState, EditorState) -> Event -> (PluginState, EditorState)
data MyEditor = MyEditor EditorState [Plugin] [PluginState]
当 PluginState 不是具体类型时?
TLDR;如何以可访问的方式存储具有非具体类型的值映射,而无需将每个插件的状态类型烘焙到我的全局状态中?添加新插件后,我可以重新编译编辑器。
谢谢!我真的坚持这个:/
如果您需要任何澄清,请尽管询问!
【问题讨论】:
-
这方面的出发点是查看 GHC 如何处理插件以及 Yi 如何处理配置。我认为两者都采用部分重新编译方法......
标签: haskell types typeclass records