Opened 5 years ago
Closed 4 years ago
#9385 closed feature request (invalid)
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 Rev(s): | ||
Wiki Page: |
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 (5)
comment:1 Changed 5 years ago by
comment:2 Changed 5 years ago by
Component: | libraries/base → Core Libraries |
---|---|
Owner: | set to ekmett |
Moving over to new owning component 'Core Libraries'.
comment:3 Changed 5 years ago by
Cc: | core-libraries-committee@… added |
---|---|
Status: | new → 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 5 years ago by
Keywords: | report-impact added |
---|
comment:5 Changed 4 years ago by
Resolution: | → invalid |
---|---|
Status: | infoneeded → closed |
Please reopen with a mandate from the libraries@ list.
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.