Как разветвить внутри монадного преобразователя

Рассмотрите, например, стек преобразователей монад

{-# 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

, что явно не сработает. Я думаю, есть какой-то способ решить такую ​​простую проблему, просто не могу понять.

9
задан Matvey Aksenov 6 March 2012 в 13:23
поделиться