我已将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
由于
答案 0 :(得分:2)
你正在寻找的两件作品
liftIO :: IO a -> X a
(>>=) :: X a -> (a -> X b) -> X b
合并它们,
liftIO fDmenuPath >>= spawn :: X ()