我试图在没有真正理解Haskell语法的情况下配置XMonad。
我用xmonad在上面运行了一个gnome会话。我想按mod-p键切换gnome面板:
我以为这样就行了
startgpanel :: X ()
startgpanel = do
gp <- readProcess "pidof" ["gnome-panel"] ""
if (length gp)
then spawn "killall gnome-panel"
else spawn "gnome-panel"
...
((myModMask, xK_g), startgpanel)
...但我发现了一个错误:
xmonad.hs:169:12:
Couldn't match expected type âX (t0 a0)â
with actual type âIO Stringâ
In a stmt of a 'do' block:
gp <- readProcess "pidof" ["gnome-panel"] ""
In the expression:
do { gp <- readProcess "pidof" ["gnome-panel"] "";
if (length gp) then
spawn "killall gnome-panel"
else
spawn "gnome-panel" }我不太理解Monad的概念,我只是想做一些IO,但它似乎非常复杂……
发布于 2016-05-23 18:33:42
正如其他人所提到的,您需要使用liftIO。
还请参阅对这一问题的讨论:
How do I use the output of readProcess in an xmonad keybinding?
而不是readProcess,您可能需要使用readProcessWithInput。
发布于 2016-05-23 18:30:03
您需要在liftIO中包装IO操作,才能在X中运行它。此外,不能只将length的结果用作if语句的Bool,因为它返回Int
startgpanel :: X ()
startgpanel = do
gp <- liftIO $ readProcess "pidof" ["gnome-panel"] ""
if (length gp > 0)
then spawn "killall gnome-panel"
else spawn "gnome-panel"发布于 2016-05-23 18:50:55
由于xmonad处理进程的所有缺点,我建议您将整个该死的逻辑转移到外壳中;绑定此操作的一个键:
spawn "pidof gnome-panel && killall gnome-panel || gnome-panel"听着,妈,没有do!
https://stackoverflow.com/questions/37397614
复制相似问题