Opened 9 months ago
Last modified 2 months ago
#9385 infoneeded feature request
Additions to Control.Monad
Reported by: | olf | Owned by: | ekmett |
---|---|---|---|
Priority: | low | Milestone: | |
Component: | Core Libraries | Version: | 7.8.2 |
Keywords: | report-impact | Cc: | hvr, ekmett, core-libraries-committee@… |
Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
Type of failure: | None/Unknown | Test Case: | |
Blocked By: | Blocking: | ||
Related Tickets: | Differential Revisions: |
Description
I'd like to propose the following additions/changes to Control.Monad:
mfilter can be generalised:
gen_mfilter :: Monad m => (a -> m ()) -> m a -> m a gen_mfilter f ma = (\a -> liftM (const a) (f a)) =<< ma
Now we obtain the old mfilter as
gen_mfilter.(guard.)
Further, m () is a monoid for every monad, which would cause conflicts for [()], to name one example. (The usual monoid instance of [()] is addition of natural numbers, while the monadic monoid instance is multiplication.) More generally, the monoid m () acts on every type m a in the following way:
mtimes :: Monad m => m () -> m a -> m a mtimes = gen_mfilter.const = liftM2 (flip const) when = mtimes.guard
For example, each element of a list can be duplicated like this:
mtimes [(),()]
To see why these functions are useful, consider the DDist monad of the ProbabilityMonads package: Since DDist () is essentially the monoid of real numbers with multiplication, gen_mfilter f updates a distribution by multiplying the weight of x by f x.
Another example is the state monad ST s, where type (a -> ST s ()) is essentially a -> s -> s, so these functions encode changes that, when used with gen_mfilter alter state, not the value.
Change History (4)
comment:1 Changed 9 months ago by ekmett
comment:2 Changed 6 months ago by thoughtpolice
- Component changed from libraries/base to Core Libraries
- Owner set to ekmett
Moving over to new owning component 'Core Libraries'.
comment:3 Changed 5 months ago by thomie
- Cc core-libraries-committee@… added
- Status changed from new to infoneeded
olf: did you submit any proposal to the libraries mailinglist for this?
See also: https://www.haskell.org/haskellwiki/Library_submissions.
comment:4 Changed 2 months ago by hvr
- Keywords report-impact added
This sort of proposal should go through the libraries@… mailing list rather than the GHC Trac.
Please feel free to submit this for discussion there to invite wider discussion.