xmobar仓库中Weather与Memory的定义及类型相关疑问
xmobar命令列表类型问题解析
类型约束逻辑验证
你的判断完全正确:
Weather、Cpu、Memory这类插件能归为同一列表,是因为它们都实现了Exec类型类,被Run构造子通过存在类型统一包装,获得了兼容的上层类型。Date是Runnable类型的独立构造子,并非通过Exec类型类+Run包装的形式,因此无法和前者放在同一列表中用Run <$>映射——两者底层类型不匹配,Haskell的强类型检查会直接报错。
Weather、Memory等插件的定义与接口实现
核心多态机制
xmobar依靠存在类型和Exec类型类实现插件的统一管理,Runnable类型的核心定义大致如下:
data Runnable = forall a. Exec a => Run a -- 存在类型包装所有实现Exec的插件 | Date String String Int -- Date是独立构造子 | ... -- 其他如HelloWorld等独立构造子
Exec是所有可运行插件必须实现的类型类,定义了run(执行逻辑)、rate(刷新频率)等核心方法。
具体插件的位置
这类插件的具体实现都在xmobar源码的Xmobar.Plugins目录下:
Weather:位于Xmobar.Plugins.Weather模块,是独立data类型,实现Exec接口,负责获取并格式化天气数据。Memory:位于Xmobar.Plugins.Memory模块,作为data类型实现Exec,用于读取系统内存使用率。Cpu:位于Xmobar.Plugins.Cpu模块,实现Exec接口,采集CPU使用率信息。
你在模块中无法直接以普通类型方式引用Weather,是因为它被存在类型Run包装,隐藏了具体类型细节,仅对外暴露Exec类型类的统一接口。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

