玩xmobar的时候看到这个
, commands = [ Run $ Weather "EGPH" ["-t","<station>: <tempC>C",
"-L","18","-H","25",
"--normal","green",
"--high","red",
"--low","lightblue"] 36000
, Run $ Network "eth0" ["-L","0","-H","32",
"--normal","green","--high","red"] 10
, Run $ Network "eth1" ["-L","0","-H","32",
"--normal","green","--high","red"] 10
, Run $ Cpu ["-L","3","-H","50",
"--normal","green","--high","red"] 10
, Run $ Memory ["-t","Mem: <usedratio>%"] 10
, Run $ Swap [] 10
, Run $ Com "uname" ["-s","-r"] "" 36000
, Run $ Date "%a %b %_d %Y %H:%M:%S" "date" 10
, Run HelloWorld
]
我没有想太多就说“哦,我可以把它拉Run
出来”并写道
, commands = Run <$> [Weather {- ... -}
, Network {- ... -}
, Network {- ... -}
, Cpu {- ... -}
, Memory {- ... -}
, Swap {- ... -}
, Com {- ... -}
, Date {- ... -}
, HelloWorld
]
但这显然行不通,因为例如Data
,HelloWorld
和Weather
是不同的类型。
但有些可以放在一个列表中,例如这种类型检查
foo = [ Weather undefined undefined undefined
, Cpu undefined undefined
, DiskU undefined undefined undefined
, Memory undefined undefined ]
但这并不
foo = [ Weather undefined undefined undefined
, Cpu undefined undefined
, DiskU undefined undefined undefined
, Date undefined undefined undefined -- because of this
, Memory undefined undefined ]
现在我看到这Date
是一个实际的data
类型,但是其他的是什么类型?
如果我打开,除了评论和名称Weather
之外,我什至看不到任何单词。Weather
module
那么什么是Weather
?我在哪里可以看到它的定义?
事实上Weather
, 和Memory
可以放在同一个列表中,这让我想到了我几乎没有经验的存在类型。然而,从那个维基页面,我看到这个
data Worker x y = forall b. Buffer b => Worker {buffer :: b, input :: x, output :: y}
是定义 a 的方法Worker
,它可以保存buffer
任何类型的 a,只要该类型实现Buffer
.
现在,鉴于foo
上面第一个的类型具有 type [Monitors]
,我猜它Monitors
正在扮演Worker
、存在类型和 的角色Weather
,Memory
并且其他类型是实现任何接口(对应于Buffer
)的类型的值构造函数,这些接口限制了该类型存在类型Monitors
可以换行。但Date
没有实现该接口,所以它不能与其他接口一起使用。
是这样吗?
但如果是这样的话......那么Weather
's、Memory
's 和其他定义以及它们的接口实现在哪里?
不要只搜索 Weather.hs 文件,而是在整个存储库中搜索。您会发现以下
Monitors.hs
功能的定义Weather
:它不是一个存在类型,只是一个普通的Haskell代数数据类型,因此没有“接口”来支持。它们可以一起出现在一个列表中,因为它们都是同一类型 (
Monitors
)。您还可以通过阅读xmobar 的 Haddock 文档来找到这一点,而不是深入研究源代码。它有很好的索引和交叉链接,因此您可以找到所需的定义,如果您想查看更多详细信息,还可以链接到源。
有一个密切相关的存在类型
Runnable
,定义Runnable.hs
为这是存在类型,允许
Run $ Date ...
与其他监视器(例如 )位于同一列表中Run $ Memory ...
,即使Date
类型和Monitors
类型不直接相关。它们各自满足Runnable
约束条件,并且Runnable
包装器隐藏所有其他细节,以便可以统一处理它们。