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.

Trac field | Value |
---|---|

Version | 7.8.2 |

Type | FeatureRequest |

TypeOfFailure | OtherFailure |

Priority | low |

Resolution | Unresolved |

Component | libraries/base |

Test case | |

Differential revisions | |

BlockedBy | |

Related | |

Blocking | |

CC | ekmett, hvr |

Operating system | |

Architecture |

GHCi happily reports the result of 1/0 to be "Infinity", but negating this value crashes.

```
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> 1/0
Infinity
Prelude> negate (1/0)
-Segmentation fault: 11
```

Bug occurs on OS X 10.7.4, ghc installed via MacPorts. This seems to be either an OS-specific issue, or maybe solved in later versions of ghc, since on a linux box it is not reproducible:

```
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> 1/0
Infinity
Prelude> negate (1/0)
-Infinity
```

Trac field | Value |
---|---|

Version | 6.10.4 |

Type | Bug |

TypeOfFailure | OtherFailure |

Priority | normal |

Resolution | Unresolved |

Component | GHCi |

Test case | |

Differential revisions | |

BlockedBy | |

Related | |

Blocking | |

CC | |

Operating system | |

Architecture |