Angesichts der Proof of Concept-Code unten möchte ich in der Lage sein, meine foo
Funktion mit der Fähigkeit, die Zeichenfolge Paul!
und die Möglichkeit, auszugeben der Rückgabewert innerhalb des InputT
Monade-Transformators ohne Verwendung von unsafePerformIO
, um den IO-Wrapper nach runExceptT
zu entfernen.Führen Sie einfache IO in Haskeline, innerhalb von InputT Monad, ohne auf unsafePerformIO
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!"
Fehle ich etwas offensichtlich hier?
Ich habe diese Lösung bereits ausprobiert, bekomme aber einen Kompilierfehler: 'Keine Instanz für (MonadIO (InputT IO)) durch Verwendung von 'liftIO'' – Paul
Gleiches für die einfache' lift' Lösung: 'No Beispiel für (MonadTrans InputT) aus einer Verwendung von "Lift" – Paul
@Paul Surprising ... hier habe ich so ein Beispiel. Vielleicht müssen Sie Control.Monad.IO.Class' importieren? – chi