いくつかのモナド変換子スタックを考えてみましょう。
{-# 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
J
今、コンテキスト内の別のスレッド内で quxes を覗いて印刷したい
g = withJ . liftIO . forkIO . forever $ peekNextQuux >>= liftIO . print
これは明らかに機能しません。このような単純な問題を解決する方法がいくつかあると思いますが、それを理解することはできません。