Haskell 如何在xmonad键绑定中使用readProcess的输出?

Haskell 如何在xmonad键绑定中使用readProcess的输出?,haskell,xmonad,Haskell,Xmonad,好的,前一段时间我在考虑根据我的盒子上的脚本输出,在我的xmonad中建立一个键绑定的效果。我最终决定不这样做是因为一些无关的原因,但我最近确实尝试做了一些类似的事情,只是作为学习哈斯克尔的练习 因此,考虑到函数: test = readProcess "echo" ["-n", "gvim"] [] 这是因为测试返回IO字符串,而spawn需要一个字符串 ((modm, xK_y), spawn ("xmessage " ++ test)) 嗯。那很酷。我明白IO操作是不可预测的,所以它们

好的,前一段时间我在考虑根据我的盒子上的脚本输出,在我的xmonad中建立一个键绑定的效果。我最终决定不这样做是因为一些无关的原因,但我最近确实尝试做了一些类似的事情,只是作为学习哈斯克尔的练习

因此,考虑到函数:

test = readProcess "echo" ["-n", "gvim"] []
这是因为测试返回IO字符串,而spawn需要一个字符串

((modm, xK_y), spawn ("xmessage " ++ test))
嗯。那很酷。我明白IO操作是不可预测的,所以它们应该分开。好的所以我在网上做了一些探索,得出了这个结论(放弃了xmessage,只想自己通过测试的输出):

这更糟。它进行了令人烦恼的编译,但在我尝试绑定时什么也没发生。(我还用just spawn“xmessage test”替换了它,这很有效)

所以,我想“也许我的函数有问题”,所以我回复了它,但从GCHi我得到了正确的“gvim”。然后我将其写入haskell文件:

main = test >>= putStrLn
test = readProcess "echo" ["-n", "gvim"] []
也可以正常工作

那么,我哪里做错了

编辑:解决方案是使用
runProcessWithInput
而不是
readProcess

相关链接:更新

显然,解决方案(见下面的注释)是使用
readProcessWithInput

原始答案

你说:

liftIO test >>= spawn
不起作用,但是:

liftIO test >>= (\m -> spawn ("xmessage " ++ m))
还要注意,
readProcess
返回的字符串结尾可能会有一个换行符,这可能会影响一些事情

在这方面,还有一些事情需要尝试:

return "gvim" >>= (\m -> spawn ("xmessage " ++ m))


import Data.Char

do { m <- liftIO test;  spawn ("xmessage " ++ (filter isAlpha m)) }
  • 使
    /tmp/report
    可执行

  • 运行
    /tmp/report
    并验证
    /tmp/output
  • 在monad配置中,将动作
    spawn”/tmp/report设置为“
    。通过查看预期行是否附加到
    /tmp/output
    来测试操作
  • 尝试将monad操作设置为:

    liftIO (readProcess "/tmp/report" ["B"] "") >> spawn "/tmp/report A"
    
    (注意我们在这里使用的是
    >
    ,而不是
    >=
    )当您触发操作时,您应该会看到
    B
    调用的报告行,以及
    a
    调用的报告行


  • 根据您在文件
    /tmp/output
    中看到的内容,您应该能够确定
    readProcess
    命令是否正在执行,以及
    spawn
    命令是否正在触发。

    不幸的是,没有区别。添加了一些新的想法进行尝试。我编辑了我的问题,但在当前示例中,带有-n的echo似乎没有返回换行符,至少当我在独立程序上尝试时是这样。尝试其他建议。没有乐趣:-/第一个建议确实成功,但第二个建议对我的绑定没有任何响应。添加了更多要尝试的内容。
    #!/bin/sh
    ( date; echo "/tmp/report was called with args" "$@") >> /tmp/output
    
    liftIO (readProcess "/tmp/report" ["B"] "") >> spawn "/tmp/report A"