Рассмотрите, например, стек преобразователей монад
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
...
newtype J = J { runJ :: ErrorT Foo (StateT Bar IO) a } deriving (Applicative, Functor, etc)
И некоторые функции в J
:
peekNextQuux :: J Quux
peekNextQuux = ...
withJ :: J a -> IO (Either Foo a)
withJ = ...
Затем я оказался внутри J
контекста. Я могу писать
f = withJ $ peekNextQuux >>= liftIO . print
Теперь я хочу просматривать и печатать quux внутри отдельного потока внутри J
контекста
g = withJ . liftIO . forkIO . forever $ peekNextQuux >>= liftIO . print
, что явно не сработает. Я думаю, есть какой-то способ решить такую простую проблему, просто не могу понять.