2013-06-05 14 views
5

Może robię coś głupiego tutaj, ale ja dostaję:instancja MonadException nie jest wyprowadzona

No instance for (MonadException Ti) 
    arising from a use of `getInputLine' 

w próbce kodu:

module Foo where 
import System.Console.Haskeline 
import System.Console.Haskeline.MonadException 
import Control.Monad.State 
import Control.Monad.IO.Class 

type Ti = StateT Int IO 

action :: String -> Ti() 
action s = do 
    n <- get 
    lift $ putStrLn $ show n ++ ": " ++ s 

repl :: InputT Ti() 
repl = do 
    minput <- getInputLine "?" 
    case minput of 
     Nothing -> return() 
     Just input -> lift (action input) >> repl 

Teraz System.Console.Haskeline.MonadException definiuje

MonadException IO 
(MonadIO (StateT s m), MonadException m) => MonadException (StateT s m) 

i Control.Monad.IO.Class:

MonadIO IO 
MonadIO m => MonadIO (StateT s m) 

Czy zatem nie powinien automatycznie wydedukować instancji dla Ti?

Odpowiedz

9

Nie ma instancji dla transformatora stanu Lazy, tylko ścisłego. Użyj import Control.Monad.State.Strict.

+0

Od razu do rzeczy. Dzięki! – user21338

Powiązane problemy