Re: Proposal: make liftF a method of MonadFree
Carter Schonwald <[email protected]> Sat, 17 Jul 2021 08:32:04 -0400
| Newsgroups | gmane.comp.lang.haskell.libraries |
|---|---|
| Message-ID | <CAHYVw0x4hLb9EQjHBn7N2tph2xgt4psxR8JaVNN_V3aGyKreeQ@mail.gmail.com> |
What about having the class head be Monad m, Functor f=> … MonadFree f m .. ? Is the motivation here to have a more performant liftF? What are some examples of more efficient implementations for current instances and what’s the performance delta? On Fri, Jul 16, 2021 at 6:53 PM David Feuer <[email protected]> wrote: > Another flavor would be to leave liftF alone and add a method that does > the same thing with a different name. This would preserve performance > characteristics for instances like FT, for situations where the current > implementation is faster. > > On Fri, Jul 16, 2021, 4:55 PM David Feuer <[email protected]> wrote: > >> We have >> >> class Monad m => MonadFree f m | m -> f where >> wrap :: f (m a) -> m a >> >> liftF :: (Functor f, MonadFree f m) => f a -> m a >> liftF = wrap . fmap pure >> >> I propose we change this to >> >> class Monad m => MonadFree f m | m -> f where >> wrap :: f (m a) -> m a >> >> liftF :: f a -> m a >> default liftF :: Functor f => f a -> m a >> liftF = wrap . fmap pure >> >> and add a function >> >> defaultWrap :: MonadFree f m => f (m a) -> m a >> defaultWrap = join . liftF >> >> This change is not strictly backwards compatible. Some instances might, >> hypothetically, have to add a Functor constraint. For example, the classic >> Control.Monad.Free and Control.Monad.Trans.Free would need them. However, >> those instances already have (currently redundant) Functor constraints, so >> that doesn't seem like a big deal. >> >> An alternative would be to hew more strictly to backwards compatibility >> by placing a Functor f constraint on liftF. This seems a bit sad for >> "freer" instances that don't need it. For example, we have >> >> newtype FT f m a = FT >> { runFT :: forall r. (a -> m r) -> (forall x. (x -> m r) -> f x -> m >> r) -> m r } >> >> for which >> >> liftF :: f a -> FT f m a >> liftF fa = FT $ \pur bndf -> bndf pur fa >> >> Pull request at https://github.com/ekmett/free/pull/208 >> > _______________________________________________ > Libraries mailing list > [email protected] > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries > _______________________________________________ Libraries mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries