私は一日の半分を、コードのエラーに対処する方法として、EitherTを使用する方法を理解するために費やしています。
私はこのようなトランススタックを定義しました。
-- Stuff Monad
data StuffConfig = StuffConfig {
appId :: T.Text,
appSecret :: T.Text
}
data StuffState = StuffState {
stateToken :: Maybe Token,
stateTime :: POSIXTime
}
newtype Stuff a = Stuff {
runStuff :: (ReaderT StuffConfig (StateT StuffState (EitherT T.Text IO))) a
} deriving (Monad, Functor, Applicative,
MonadIO,
MonadReader StuffConfig,
MonadState StuffState
)
askStuff :: StuffConfig -> Stuff a -> IO (Either T.Text a)
askStuff config a = do
t <- getPOSIXTime
runEitherT (evalStateT (runReaderT (runStuff a) config) (StuffState Nothing t))
ReaderT
これは、 and関数のみを使用する限り非常にうまく機能しStateT
ます。私は今、私はこのようなものを書くことができるはずだという印象を受けています:
faultyFunction :: String -> Stuff String
faultyFunction s = do
when s == "left" $ left "breaking out"
"right"
さらに重要なのは、パッケージからEither
可能なはずの戻り値を取得することです。hoistEither
errors
faultyLookup :: Map -> String -> Stuff String
faultyLookup m k = do
hoistEither $ lookup k m
私はモナド変換子に関する現実世界のハスケルの章を読み、をいじりましたlift
。しかし、私はタイプチェックするものを何も得ることができません。