這是this question的後續行動。我試圖將@ ErikR的shell合併到我的InputT循環中。 main :: IO [String]
main = do
c <- makeCounter
execStateT (repl c) []
repl :: Counter -> StateT [String] IO()
repl c = lift $ runInp
我試圖通過ghci運行的幾個例子來了解MaybeT: λ: import Control.Monad.Trans.Maybe
λ: let x = return $ 42 :: MaybeT (Either String) Int
λ: :t x
x :: MaybeT (Either String) Int
然後,我跑了它: λ: runMaybeT x
Right (Just 42
這裏是我的雞蛋包裝廠: type Eggs = Int
data Carton = Carton Eggs deriving Show
add :: Eggs -> Carton -> Maybe Carton
add e (Carton c)
| c + e <= 12 = Just (Carton $ c + e)
| otherwise = Nothing
m
所以在transformers我看到, class (Monad m) => MonadIO m where
-- | Lift a computation from the 'IO' monad.
liftIO :: IO a -> m a
instance MonadIO IO where
liftIO = id
我的理解是,這不同於MonadTrans的
例如,我有這個功能 foo :: Int -> ExceptT String (State Int) Int
foo x = if x == 0 then throwError "x == 0" else return x
,如果我用traverse evalState (runExceptT $ traverse foo [0,1,2]) 0
返回 Left "x == 0"
但我