だからtransformers
に私はMonadIOがより一般的なMonadTransではなく、IO固有の理由は何ですか?
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と異なることの理由は、あなたが4つので構成されるモナド変圧器で作られたいくつかのM1T (M2T (M3T (M4T IO))) x
を持っている場合、その後、あなたはlift . lift . lift . lift $ putStrLn "abc"
が、あなたにはしたくないということであることを理解しますむしろちょうどliftIO $ putStrLn "abc"
です。
しかし、IO
のこの特異性は、上記の基本的な定義がliftIO
のこの奇妙な再帰セットであると思われる場合、非常に奇妙なようです。 (ExceptT :~: MaybeT) IO x
のようないくつかのコンビネータのためのnewtype宣言がなければならないのいずれかのようにそれはそう単一lift
はあなたが必要とするすべてであると思われる、(私が?これはモナド変圧器の変圧器であると仮定)、または他のいくつかのマルチのparam型クラス
class (Monad m) => MonadEmbed e m
-- | Lift a computation from the `e` monad.
embed :: e a -> m a
instance (Monad m) => MonadEmbed m m where
embed = id
transformers
は、MonadTransシーケンスをIO
に根ざす必要がないように、これらのアプローチの1つを使用していないのはなぜですか?トランスフォーマーがすべての「その他の」エフェクトを処理して、一番下の唯一のものがIdentity
(すでにreturn :: a -> m a
で処理されています)またはIO
のいずれかになりますか?または上記には、transformers
ライブラリには含まれていないUndecidableInstancesのようなものが必要ですか?または何?
AFAIK 'トランスフォーマーズ 'は、マルチパラメータ型クラスを含む**ではありませんので、あなたの例はこの制限に従って"許可されていません "。 'mtl'ライブラリは、' MonadState'のようないくつかの型付けと、何度も持ち上げることを避けるためのいくつかのインスタンスを提供します。 – Bakuriu