Arrows that are also Functors
uzytkownik2 at gmail.com
Tue Apr 26 21:38:32 CEST 2011
On Tue, 2011-04-26 at 15:13 -0400, Tyson Whitehead wrote:
> On April 26, 2011 13:50:10 Maciej Marcin Piechotka wrote:
> > On Tue, 2011-04-19 at 23:48 -0400, Tyson Whitehead wrote:
> > > On April 19, 2011 23:22:12 Tyson Whitehead wrote:
> > > > ArrowLoop from MonadFix
> > > >
> > > > loop' f = fst' .' loop'' (f .' arr' (second snd))
> > > >
> > > > where loop'' f = mfix (\y -> f .' arr' (,y))
> > >
> > > BTW haskellers, I've been wondering if mfix would better be defined as
> > >
> > > mfix' :: (m a -> m a) -> m a
> > >
> > > where "mfix' f = mfix (f . pure)" for the computational monads. The
> > > advantage being you can give a useful definition for structural monads
> > > as well.
> > What would be the difference with fix?
> For the IO monad, for example, normal fix would give you an IO value which
> would repeat the underlying IO action. The mfix' above give you the result of
> the first run of the IO action lazily bound in an IO context. Consider
> Prelude> fix $ fmap (1:)
> ... never returns (overflows the stack and dies) ...
> Prelude> mfix' $ fmap (1:)
> ... returns "return $ repeat 1" ...
> The difference between mfix and mfix' being you can't (or at least I couldn't)
> implement it for non-singleton monads such as list.
But... list is monad fix. From base:
> instance MonadFix  where
> mfix f = case fix (f . head) of
>  -> 
> (x:_) -> x : mfix (tail . f)
Prelude> mfix (fmap (1:) . return)
> The problem was mfix had
> to do a map like operation across the underlying structure to invoke the
> function on the lazily bound singletons before any of the structure existed.
> Cheers! -Tyson
I still cannot find any use which would not be covered by either mfix or fix.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 836 bytes
Desc: This is a digitally signed message part
More information about the Libraries