Выполните простой ввод-вывод в 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!"
Я что-то упускаю здесь очевидное?