[GHC] #16332: Feature request: Data.Foldable.asumMap
GHC
ghc-devs at haskell.org
Sun Feb 17 02:54:32 UTC 2019
#16332: Feature request: Data.Foldable.asumMap
-------------------------------------+-------------------------------------
Reporter: josephcsible | Owner: (none)
Type: feature request | Status: new
Priority: normal | Milestone:
Component: libraries/base | Version: 8.6.3
Resolution: | Keywords:
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 changed by josephcsible:
Old description:
> I'd like to request that an `asumMap` function be added to
> `Data.Foldable`, which would be a generalization of `concatMap` in the
> same way that `asum` is a generalization of `concat`. Its proposed
> definition:
>
> {{{#!hs
> asumMap :: (Foldable t, Alternative f) => (a -> f b) -> t a -> f b
> asumMap f = foldr ((<|>) . f) empty
> }}}
>
> This is almost equivalent to a combination of "asum" and "fmap", but it
> doesn't require a "Functor t" constraint like that does.
>
> Notes on its usefulness:
> * Here's a Stack Overflow question that asks for a function ((a -> Maybe
> b) -> [a] -> Maybe b) that this is a more general form of:
> https://stackoverflow.com/questions/19643664/standard-haskell-
> function-a-maybe-b-a-maybe-b
> * The alternative prelude Relude includes this function (although theirs
> is implemented in terms of foldMap and Alt instead of foldr and <|>):
> https://hackage.haskell.org/package/relude-0.4.0/docs/Relude-Foldable-
> Fold.html#v:asumMap
> * This can also be thought of as a more useful version of
> `Data.Foldable.find`. For example, if you have a sum type such as
> `Either` and want to find the value in first one of it that's `Right`,
> you could do `asumMap rightToMaybe x`. If you were to instead do `find
> isRight x`, the `Either` won't be unwrapped even though you know it's
> `Right`, so you'll then have to do something unclean (like a partial
> function) to get the value out.
New description:
I'd like to request that an `asumMap` function be added to
`Data.Foldable`, which would be a generalization of `concatMap` in the
same way that `asum` is a generalization of `concat`. Its proposed
definition:
{{{#!hs
asumMap :: (Foldable t, Alternative f) => (a -> f b) -> t a -> f b
asumMap f = foldr ((<|>) . f) empty
}}}
This is almost equivalent to a combination of `asum` and `fmap`, but it
doesn't require a `Functor t` constraint like that does.
Notes on its usefulness:
* Here's a Stack Overflow question that asks for a function (`(a -> Maybe
b) -> [a] -> Maybe b`) that this is a more general form of:
https://stackoverflow.com/questions/19643664/standard-haskell-
function-a-maybe-b-a-maybe-b
* The alternative prelude Relude includes this function (although theirs
is implemented in terms of `foldMap` and `Alt` instead of `foldr` and
`<|>`): https://hackage.haskell.org/package/relude-0.4.0/docs/Relude-
Foldable-Fold.html#v:asumMap
* This can also be thought of as a more useful version of
`Data.Foldable.find`. For example, if you have a sum type such as `Either`
and want to find the value in first one of it that's `Right`, you could do
`asumMap rightToMaybe x`. If you were to instead do `find isRight x`, the
`Either` won't be unwrapped even though you know it's `Right`, so you'll
then have to do something unclean (like a partial function) to get the
value out.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16332#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list