Brincando com o xmobar, quando vi isso
, 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
]
Eu sem pensar muito falei "ah, posso tirar isso Run
" e escrevi
, commands = Run <$> [Weather {- ... -}
, Network {- ... -}
, Network {- ... -}
, Cpu {- ... -}
, Memory {- ... -}
, Swap {- ... -}
, Com {- ... -}
, Date {- ... -}
, HelloWorld
]
mas isso obviamente não funciona, porque, por exemplo Data
, HelloWorld
e Weather
são tipos diferentes.
Mas alguns podem ir juntos dentro de uma lista, por exemplo, este tipo verifica
foo = [ Weather undefined undefined undefined
, Cpu undefined undefined
, DiskU undefined undefined undefined
, Memory undefined undefined ]
mas isso não
foo = [ Weather undefined undefined undefined
, Cpu undefined undefined
, DiskU undefined undefined undefined
, Date undefined undefined undefined -- because of this
, Memory undefined undefined ]
Agora vejo que é um tipo Date
realdata
, mas quais são os outros?
Se eu abrir, Weather
nem vejo uma única palavra Weather
além de um comentário e no nome do arquivomodule
.
Então, o que é Weather
? E onde vejo sua definição?
O fato de Weather
e, digamos, Memory
poderem estar na mesma lista me faz pensar em tipos existenciais dos quais tenho pouca experiência. No entanto, nessa página wiki, vejo que isso
data Worker x y = forall b. Buffer b => Worker {buffer :: b, input :: x, output :: y}
é a maneira de definir a Worker
que pode conter a buffer
de qualquer tipo, desde que esse tipo implemente Buffer
.
Agora, dado que o tipo do primeiro foo
acima tem type [Monitors]
, acho que Monitors
está desempenhando o papel de Worker
, o tipo existencial, e Weather
, Memory
e outros são construtores de valor de tipos que implementam qualquer interface (correspondente a Buffer
) que esteja restringindo o tipo que o tipo existencial Monitors
pode quebrar. Mas Date
não implementa essa interface, então não pode combinar com as outras.
É assim?
Mas se for esse o caso... então onde estão as definições Weather
de ', Memory
' e outros, juntamente com a implementação da interface?
Em vez de pesquisar apenas no arquivo Weather.hs, pesquise em todo o repositório. Você encontrará
Monitors.hs
recursos com uma definição deWeather
:Não é um tipo existencial, apenas um tipo de dados algébrico comum de Haskell, portanto não há "interface" para suportar. Eles podem ir juntos em uma lista porque são todos do mesmo tipo (
Monitors
).Você também pode descobrir isso lendo a documentação do Haddock para xmobar em vez de examinar a fonte. Está bem indexado e com links cruzados para que você possa encontrar as definições que procura e links para a fonte se quiser ver mais detalhes.
Existe um tipo existencial intimamente relacionado
Runnable
, definido emRunnable.hs
, comoEste é o tipo existencial que permite
Run $ Date ...
estar na mesma lista que os outros monitores comoRun $ Memory ...
, mesmo que oDate
tipo eMonitors
o tipo não estejam diretamente relacionados. Cada um deles satisfaz asRunnable
restrições e oRunnable
wrapper oculta todos os outros detalhes para que possam ser tratados uniformemente.