FactoryArrow
I’ve been playing around with an Arrow concept, which to my knowledge is original. I’ve decided to call this a FactoryArrow:
newtype FactoryArrow m n a b = FactoryArrow { runFactory :: m (Kleisli n a b) }
Where m and n are Monads. m is a single-pass initialization monad, while n is a multiple-pass working monad. The arrow supports all of the standard accessory arrow typeclasses, including ArrowLoop if n implements MonadFix, and ArrowApply if m and n are the same.
This arrow simply captures a two-phase initialize-and-run design pattern.
To the best of my imagination, there cannot be a corresponding useful FactoryMonad. I would be extremely interested if anyone can contradict me on that point.
My current interest is in using the FactoryArrow as a replacement for the mealy-style arrows by using IORefs (or potentially even STM transaction variables) to store automaton states instead of unevaluated thunks.
The corresponding implementation as of the time of this writing.
Comments
Comment from Lane
Time 9 August 2009 at 9:06 pm
Are you talking about the StaticArrow?
I see it. Good catch.
Comment from Twan van Laarhoven
Time 9 August 2009 at 7:23 pm
Any Arrow wrapped in an Applicative gives another arrow
newtype ApArrow f (~>) a b = ApArrow { runApArrow :: f (a ~> b) }
Since every Monad is also an Applicative functor, your FactoryArrow m n = ApArrow m (Kleisli n)