Я только изучаю Хаскель и монадные преобразователи, и я обнаружил, что у меня есть IO (IO ()), который я хотел бы превратить в просто IO ().Я уверен, что я делаю что-то не так, но не могу точно определить, где я заблудился.
Вот упрощенный пример того, что я пытаюсь сделать.Это сложный способ реализации echo
, но он иллюстрирует проблему.
userInput :: Monad m => ReaderT (IO String) m (IO String)
userInput = ask
echo :: Monad m => ReaderT (IO String) m (IO ())
echo = userInput >>= \input -> -- unwrap ReaderT to get an IO String
input >>= (\s -> -- unwrap IO String to get a String
putStrLn s) -- print out the String
& return -- rewrap into a ReaderT
main :: IO (IO ()) -- How to turn IO (IO ()) to IO ()?
main = runReaderT echo getLine
В моем реальном приложении у меня есть приложение Spock , которое отправляет HTTP-запросы на вышестоящий сервер.,Приложения Spock используют монадный стек преобразователя под названием SpockCtxT
, и я хотел бы вставить ReaderT
в стек, чтобы абстрагировать HTTP-запрос, чтобы я мог поменять его для фиктивной реализации в моих тестах.
По сути, идея заключается в стеке монадных преобразователей, в котором один из преобразователей дает IO
, будь то HTTP-запрос или getLine
.Я думаю об этом неправильно или есть какой-то способ сделать это?