Итак, некоторое время назад я думал об основе эффекта привязки клавиш в моем xmonad на основе вывода скрипта на моем компьютере. В конце концов я решил не делать этого по несвязанным причинам, но недавно я попытался сделать что-то подобное просто в качестве упражнения в изучении Haskell.
Итак, учитывая функцию:
test = readProcess "echo" ["-n", "gvim"] []
Это вызывает, потому что test возвращает строку ввода-вывода, а spawn ожидает строку.
((modm, xK_y), spawn ("xmessage " ++ test))
В порядке. Это классно. Я понимаю, что операции ввода-вывода непредсказуемы, поэтому их следует хранить отдельно. Отлично. Итак, я немного покопался в Интернете и добрался до этого (отбросил xmessage и просто хочу сам пройти вывод теста):
((modm, xK_y), liftIO test >>= spawn)
Это хуже. Он раздражающе компилируется, но ничего не происходит, когда я пробую привязку. (Я также заменил его просто порождающим «xmessage test», и это сработало)
Итак, затем я подумал: «Может быть, что-то не так с моей функцией», поэтому я повторил ее, но от GCHi я получил «gvim», что правильно. Итак, я пишу это в файл haskell:
main = test >>= putStrLn
test = readProcess "echo" ["-n", "gvim"] []
Тоже работает корректно.
Итак, где я ошибся?
РЕДАКТИРОВАТЬ: Решение состояло в том, чтобы использовать runProcessWithInput
вместо readProcess
. Связанная ссылка: https://ghc.haskell.org/trac/ghc/ticket/5212 привязка xmonad io не работает