Выполните простой ввод-вывод в Haskeline, внутри монады InputT, не прибегая к unsafePerformIO

Учитывая приведенное ниже подтверждение концепции, я бы хотел как-то выполнитьfoo функция с возможностью вывода строкиPaul! и возможность получения его возвращаемого значения внутриInputT монад-трансформер без использованияunsafePerformIO удалить обертку IO послеrunExceptT.

import Control.Monad.Except

import System.IO.Unsafe (unsafePerformIO)
import System.Console.Haskeline


type ErrorWithIO = ExceptT String IO


foo :: String -> ErrorWithIO String
foo "paul" = do liftIO $ putStrLn "Paul!"
                return "OK!"
foo _ = throwError "ERROR!"


runRepl :: IO ()
runRepl = runInputT defaultSettings $ loop


loop :: InputT IO ()
loop = do
    line <- getInputLine "> "
    case line of
        Nothing -> return ()
        Just input -> do return $ putStrLn "asd"
                         case unsafePerformIO $ runExceptT $ foo input of
                             Left err -> outputStrLn err >> loop
                             Right res -> do
                                 x <- outputStrLn . show $ res
                                 loop




main :: IO ()
main = runRepl >> putStrLn "Goodbye!"

Я что-то упускаю здесь очевидное?

Ответы на вопрос(1)

Ваш ответ на вопрос