У меня есть новая идея использовать XMonad XMonad.Prompt.Input.Я подумал, что было бы здорово, если бы можно было создать простой калькулятор, который вычислял бы то, что пользователь вводит, и возвращал результат в тексте следующего приглашения, заканчивая, когда пользователь нажимает escape ... Проблема в том, что я неЯ знаю, что делать с типами ...
Пока у меня есть это:
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 String, и мне нужна нормальная String для inputPrompt, включенная из import XMonad.Prompt.Input.Но я понятия не имею, как с этим справиться ...
Большое спасибо за вашу помощь!
РЕДАКТИРОВАТЬ: Теперь у меня есть это:
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
Который компилируется, но работает не так, как ожидалось.Я могу открыть приглашение, ввести текст, затем он запускает команду оболочки, но затем он просто отбрасывает значение stdo вместо того, чтобы использовать его в качестве нового текста приглашения.
Я ожидаю, что версия с echo сделает следующее: Когда я открываю приглашение, отображается некоторая строка по умолчанию.Когда я ввожу значение и нажимаю return, открывается другое приглашение с ранее введенным значением (благодаря echo, который просто возвращает то, что получил).Если бы это работало с echo, я бы заменил echo на некоторый bash-скрипт для выполнения вычислений и вернул бы результат вместо echo.
Recent EDIT: Наконец решено.Окончательный код моего небольшого фрагмента калька находится в моем ответе :) Спасибо всем.