2013-06-05 73 views
5

也許我在做一些愚蠢的事在這裏,但我越來越:MonadException實例未推斷

No instance for (MonadException Ti) 
    arising from a use of `getInputLine' 
的代碼示例中

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 

現在,System.Console.Haskeline.MonadException定義

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

and Control.Monad.IO.Class

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

那麼,是不是應該自動推導出實例Ti

回答

9

Lazy狀態轉換器沒有實例,只有嚴格的狀態轉換器。使用import Control.Monad.State.Strict

+0

恰到好處。謝謝! – user21338