Как отмечает @dfeuer, вы, вероятно, хотели написать:
myfct' :: Monad m => ReaderT (a,c,d) m a -> ReaderT (a,b,c,d,e) m a
Это действие, которое требует только доступа к контексту (a,c,d)
, и поднимает его до действия, которое может выполняться в более широком контексте. что поставляет (a,b,c,d,e)
. Это можно записать с помощью magnify
примерно так:
myfct' = magnify . to $ \(a,_,c,d,_) -> (a,c,d)
С другой стороны, если вы на самом деле имели в виду то, что написали:
myfct :: Monad m => ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a
, то вам придется объясните, что это должно делать. В частности, если у вас есть действие, которое обращается к компоненту b :: String
:
action :: Reader (Int,String,Int,Int,Int) Int
action = asks $ \(_,b,_,_,_) -> length (b :: String)
Как вы хотите запустить его в контексте без b :: String
?
test' :: Int
test' = runReader (myfct action) (1,2,3)