У меня есть новая идея использования XMonad XMonad.Prompt.Input. Я подумал, что это было бы здорово, если бы можно было сделать простой калькулятор, который бы вычислил, что пользователь вводит и возвращает результат в тексте следующего приглашения, заканчивая, когда пользователь нажимает кнопку ... Проблема в том, что я не делаю знаю, как иметь дело с типами ...Простой калькулятор в подсказке xmonad
до сих пор у меня есть это:
Который не работает. Я получаю:
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 и мне нужна нормальная строка для inputPrompt включенных от импорта XMonad.Prompt.Input. Но я понятия не имею, как с этим справиться ...
Большое спасибо за вашу помощь!
EDIT: Теперь у меня есть это:
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 вместо того, чтобы использовать его в качестве нового текста приглашения.
Я ожидаю, что версия с эхом сделает следующее: Когда я открываю приглашение, отображается строка по умолчанию. Когда я вводим значение и нажимаю return, открывается другое приглашение с ранее введенным значением (благодаря эхо, которое возвращает только то, что у него есть). Если он работал с echo, я бы заменил echo некоторым скриптом bash для выполнения вычислений и вернул результат вместо echo.
Последнее изменение: Окончательно разрешено. Окончательный код моего небольшого отрывка из блокнот в моем ответе :) Спасибо всем.
Это сработало. Большое спасибо! –