如何在Xmonad键绑定中使用IO String函数?

时间:2014-04-15 21:31:38

标签: haskell monads xmonad

我已将Xmonad配置为启动 dmenu_path

((myModMask, xK_p), spawn (sHOME ++ "/.xmonad/dmenu_path"))

spawn 运行脚本, dmenu_path 运行 dmenu 并执行命令。

〜/ .xmonad / dmenu_path

eval "exec $(dmenu)"

我想用haskell函数替换脚本。我在〜/ .xmonad / xmonad.hs 中编写了一个简单的“IO String”函数(fDmenuPath :: IO String)。我想做点什么:

((myModMask, xK_p), spawn (fDmenuPath))

正在运行xmonad --recompile会显示此错误:

xmonad.hs:130:35
    Couldn't match type `IO String' with `[Char]'
    Expected type: String
      Actual type: IO String
....

我是哈斯克尔的新手。我不知道如何使用该函数来检索结果字符串,并将其传递给 spawn

有什么建议吗?

这是 fDmenuPath 的代码:

pdmpCmd1 p = proc "echo" [p]
pdmpCmd2 = proc "tr" [":","\\n"]
pdmpCmd3 = proc "uniq" []
pdmpCmd4 = proc "sed" ["s|$|/|"]
pdmpCmd5 = proc "xargs" ["ls","-lu","--time-style=+%s"]
pdmpCmd6 = proc "awk" ["/^(-|l)/ { print $6, $7 }"]
pdmpCmd7 = proc "sort" ["-rn"]
pdmpCmd8 = proc "cut" ["-d ","-f","2"]
pdmpCmd9 = proc "dmenu" ["-fn","-*-terminus-*-r-normal-*-*-120-*-*-*-*-iso8859-*","-nb","#000000","-nf","#839496","-sb","#859900"]

fDmenuPath :: IO String
fDmenuPath = do
    sPATH <- getEnv "PATH"
    (_, Just ho1, _, hp1) <- createProcess (pdmpCmd1 sPATH)
                    { std_out = CreatePipe }
    (_, Just ho2, _, hp2) <- createProcess pdmpCmd2
                    { std_in = UseHandle ho1 ,
                      std_out = CreatePipe }
    (_, Just ho3, _, hp3) <- createProcess pdmpCmd3
                    { std_in = UseHandle ho2 ,
                      std_out = CreatePipe }
    (_, Just ho4, _, hp4) <- createProcess pdmpCmd4
                    { std_in = UseHandle ho3 ,
                      std_out = CreatePipe }
    (_, Just ho5, _, hp5) <- createProcess pdmpCmd5
                    { std_in = UseHandle ho4 ,
                      std_out = CreatePipe }
    (_, Just ho6, _, hp6) <- createProcess pdmpCmd6
                    { std_in = UseHandle ho5 ,
                      std_out = CreatePipe }
    (_, Just ho7, _, hp7) <- createProcess pdmpCmd7
                    { std_in = UseHandle ho6 ,
                      std_out = CreatePipe }
    (_, Just ho8, _, hp8) <- createProcess pdmpCmd8
                    { std_in = UseHandle ho7 ,
                      std_out = CreatePipe }
    (_, Just ho9, _, hp9) <- createProcess pdmpCmd9
                    { std_in = UseHandle ho8 ,
                      std_out = CreatePipe }
    sOut <- hGetContents ho9
    ec1 <- waitForProcess hp1
    ec2 <- waitForProcess hp2
    ec3 <- waitForProcess hp3
    ec4 <- waitForProcess hp4
    ec5 <- waitForProcess hp5
    ec6 <- waitForProcess hp6
    ec7 <- waitForProcess hp7
    ec8 <- waitForProcess hp8
    ec9 <- waitForProcess hp9
    return $ sOut

由于

1 个答案:

答案 0 :(得分:2)

你正在寻找的两件作品

liftIO :: IO a -> X a
(>>=) :: X a -> (a -> X b) -> X b

合并它们,

liftIO fDmenuPath >>= spawn :: X ()