
I was wondering why, since IO is an instance of MonadFix [1], and therefore of ArrowLoop (Kleisli m), and since "The loop operator expresses computations in which an output value is fed back as input, even though the computation occurs only once." [2], the MonadFix or ArrowLoop class (through use of mfix or loop, respectively) doesn't appear in anyone's suggestion, where the top-level state was the thing looped over. Or is this more or less what is going on in the function oneShot :: IO a -> ACIO (IO a) oneShot io = mdo mv <- newMVar $ do a <- io let loop = do putMVar mv loop return a loop return $ do act <- takeMVar mv act but without explicitly using the MonadFix or ArrowLoop classes? Dan [1] http://www.haskell.org/ghc/docs/6.4.1/html/libraries/base/Control-Monad-Fix.... [2] http://www.haskell.org/ghc/docs/6.4.1/html/libraries/base/Control-Arrow.html Claus Reinke wrote:
what we do not know is how to share IO actions themselves in a demand-driven way, ie how to describe an IO action that is executed at most once, only on demand, with shared result.