私は現実世界のハスケルでモナールトランスを探していました。 モナド変圧器を作るには、MonadTrans型クラスのインスタンスにする必要があると言われています。モナドトランスフォーマーリフト
この本ではトランスフォーマーであるMaybeT m a
が新たに定義されています。
彼らはこの新しい変圧器のためmonadTrans型クラスを定義しました。そして、彼らは、この変圧器のためのMonadStateのインスタンスを作っ
instance MonadTrans MaybeT where
lift m = MaybeT (Just `liftM` m)
:
instance (MonadState s m) => MonadState s (MaybeT m) where
get = lift get
put k = lift (put k)
私はリフト機能が取っている理解して何から基底のモナドを右のコンストラクタにラップします。しかし、私はMonadState型クラスのgetまたはputの実装を取得していませんが、ここで実際に何が起きているのか理解するのに役立つと思います。私はまた、タイプクラスがどのように定義されているかをmtlパッケージで知っていますが、WriterT、StateTなどでモナド変換器のスタックを使用できますが、get、put、tellなどの関数を実際に持ち上げることなく使用できます。私はこれがどのように機能するのだろうかと疑問に思っていました。これらのタイプのクラスとは強く関係していますが、わかりません。
もし私たちが 'MaybeT(State Int)String'のようなものを持っていたら、どうしたら実際の持ち上げがうまくいっているのか理解できないと思います。リフト機能に何が渡されていますか? – Zubair
@Zubair 'lift'は内側のモナドに向けられたアクションを取り、それを外側のモナドに包み返します。 IOW、この特定のケースでは、 'lift :: State Int String - > MaybeT(State Int)String'です。 –