最後に私はそれを理解します。どちらもOKです。
すべての設定項目の値が単なるIntであると仮定します。
MaybeT (Reader (\r -> Just 123))
か::
のような値を持つことになります
ReaderT (\r -> Just 123)
または
ReaderT (\r -> Nothing)
:
ReaderT ConfigMap Maybe Int
は次のように値を持っています
どちらかといえば、最初にいくつかの読み込みを行い、読み込みがNothing
を返すかどうかに応じて続行するかどうかを決定できます。値は異なる外形を持ちますが、同じ機能性を持ちます。ここ
私の小さなデモ:
import qualified Data.Map as M
import Control.Monad
import Control.Monad.Reader
import Control.Monad.Trans
import Control.Monad.Trans.Maybe
type Config = M.Map String Int
getConfig :: String -> MaybeT (Reader Config) Int
getConfig key = MaybeT $ do
m <- ask
return $ M.lookup key m
readAll :: Config -> Maybe (Int, Int)
readAll m =
let r = runMaybeT $ do
a <- getConfig "a"
b <- getConfig "b"
return (a, b)
in runReader r m
main :: IO()
main = do
putStrLn $ show (readAll $ M.fromList [("x", 3), ("b", 4)])
私の第二のデモ:
import qualified Data.Map as M
import Control.Monad
import Control.Monad.Reader
import Control.Monad.Trans
import Control.Monad.Trans.Maybe
type Config = M.Map String Int
getConfig :: String -> ReaderT Config Maybe Int
getConfig key = ReaderT $ \r -> M.lookup key r
readAll :: Config -> Maybe (Int, Int)
readAll m =
let r = runReaderT $ do
a <- getConfig "a"
b <- getConfig "b"
return (a, b)
in r m
main :: IO()
main = do
putStrLn $ show (readAll $ M.fromList [("a", 3), ("b", 4)])
出典
2017-05-08 05:49:14
brk
あなたは 'newtype'コンストラクタなしタイプを展開すると、あなたはどちらをr'にアンロール見つける - >たぶん'、それは彼らが同じかもしれないという良いヒントです。しかし、モナド演算子が同じ型(例えば、型が同じであっても動作が異なる場合があります。 'ListT(State s)'と 'StateT s []'です。 (これは 'ListT'が壊れているからですが、これはこのような場合の良い例です!) – luqui
' ReaderT Maybe'と 'MaybeT Reader'は本当に特別なペアです。そして、このようなペアを作るのは同じ "内部形状"です(すべての型コンストラクタとモナド値のラムダ( '\ a - >')を取り除いた後の残りのものです)。ところで、失敗する可能性のあるログ計算では、 'MaybeT Writer'と' WriterT Maybe'は異なります。前者は '(Nothing、最初のN行のログ)'で失敗し、後者は 'Nothing '。 – brk