Haskell で 2 つのモナド アクションを順番に作成し、2 番目のモナドによって生成された値を破棄し、両方のアクションに引数を渡したいと考えています。
これは私には a のように聞こえますReader
— 関数型r -> m a
は と同型ReaderT r m a
であり、モナドはr
すべての「穴」に同じ値を暗黙的に差し込むことによって機能します。たとえば、次のようになります。
import Control.Applicative
import Control.Monad.Reader
example :: IO String
example = getLine >>= discarding putStrLn
discarding :: Monad m => (a -> m b) -> a -> m a
discarding action = runReaderT (ReaderT action *> ask)
必要な演算子は次のようなものです。
action `thingy` extra = action >>= discarding extra
しかしもちろんdiscarding
、より単純な実装があります。
discarding :: Applicative f => (a -> f b) -> a -> f a
discarding action a = action a *> return a
…というわけで、これは本当にコードゴルフだと思います。しかし、これが大規模な一般的なパターンである、より複雑なプログラムでは、試してみる価値があるかもしれません。基本的に、あなたが持っている場合:
a0 :: r -> m a0
a1 :: r -> m a1
.
.
.
an :: r -> m an
すると、次のようになります。
ReaderT a0 :: ReaderT r m a0
ReaderT a1 :: ReaderT r m a1
.
.
.
ReaderT an :: ReaderT r m an
その後:
runReaderT (ReaderT a0 <* ReaderT a1 <* ... <* ReaderT an) :: r -> m a0