我有一个使用 xmonad 的 XMonad.Prompt.Input 的新想法。我认为这真的很酷,如果可以制作一个简单的计算器来计算用户输入的内容并在下一个提示文本中返回结果,当用户按下转义键时完成......问题是,我没有非常知道如何处理类型...
到目前为止,我有这个:
runAndGetOutput cmd = do
(_, pout, _, phandle) <- runInteractiveCommand cmd
waitForProcess phandle
a <- hGetContents pout
return a
calcPrompt :: XPConfig -> String -> X ()
calcPrompt c ans =
inputPrompt c ans ?+ \ next ->
calcPrompt c (runAndGetOutput ("calc" ++ next))
这是行不通的。我得到:
Couldn't match expected type `[Char]' with actual type `IO String'
Expected type: String
Actual type: IO String
In the return type of a call of `runAndGetOutput'
In the second argument of `calcPrompt', namely
`(runAndGetOutput ("calc" ++ next))'
我确实理解这与 runAndGetOutput 返回 IO 字符串这一事实有关,我需要一个正常的字符串用于从导入 XMonad.Prompt.Input 中包含的 inputPrompt。但我不知道如何处理它......
非常感谢你的帮助!
编辑: 现在我有这个:
runAndGetOutput :: String -> IO String
runAndGetOutput cmd = do
(_, pout, _, phandle) <- runInteractiveCommand cmd
a <- hGetContents pout
waitForProcess phandle
return a
calcPrompt :: XPConfig -> String -> X ()
calcPrompt c ans =
inputPrompt c ans ?+ \next ->
liftIO (runAndGetOutput ("echo -n " ++ next)) >>= calcPrompt c
哪个编译,但没有按预期工作。我可以打开提示,输入一些文本,然后它会启动 shell 命令,但它只是丢弃 stdo 值而不是将其用作新的提示文本。
我希望带有 echo 的版本执行以下操作:当我打开提示时,会显示一些默认字符串。当我输入一个值并按回车键时,会打开另一个提示,其中包含先前输入的值(感谢 echo,它只返回它所得到的值)。如果它与 echo 一起工作,我会用一些 bash 脚本替换 echo 来执行计算并返回结果而不是 echo。
最近的编辑: 终于解决了。我的小计算片段的最终代码在我的自我回答中:)谢谢大家。