首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XMonad的Haskell readProcess配置

使用XMonad的Haskell readProcess配置
EN

Stack Overflow用户
提问于 2016-05-23 18:03:25
回答 3查看 261关注 0票数 1

我试图在没有真正理解Haskell语法的情况下配置XMonad。

我用xmonad在上面运行了一个gnome会话。我想按mod-p键切换gnome面板:

  • 如果gnome面板没有运行,我想启动它。
  • 如果gnome面板已经在运行,我想杀死它

我以为这样就行了

代码语言:javascript
复制
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)
  ...

但我发现了一个错误:

代码语言:javascript
复制
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,但它似乎非常复杂……

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-23 18:33:42

正如其他人所提到的,您需要使用liftIO

还请参阅对这一问题的讨论:

How do I use the output of readProcess in an xmonad keybinding?

而不是readProcess,您可能需要使用readProcessWithInput

票数 1
EN

Stack Overflow用户

发布于 2016-05-23 18:30:03

您需要在liftIO中包装IO操作,才能在X中运行它。此外,不能只将length的结果用作if语句的Bool,因为它返回Int

代码语言:javascript
复制
startgpanel :: X ()
startgpanel = do
  gp <- liftIO $ readProcess "pidof" ["gnome-panel"] ""
  if (length gp > 0)
    then spawn "killall gnome-panel"
    else spawn "gnome-panel"
票数 1
EN

Stack Overflow用户

发布于 2016-05-23 18:50:55

由于xmonad处理进程的所有缺点,我建议您将整个该死的逻辑转移到外壳中;绑定此操作的一个键:

代码语言:javascript
复制
spawn "pidof gnome-panel && killall gnome-panel || gnome-panel"

听着,妈,没有do

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37397614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档