[GHC] #13191: Make liftA2 a method of Applicative
GHC
ghc-devs at haskell.org
Fri Jan 27 03:09:42 UTC 2017
#13191: Make liftA2 a method of Applicative
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner: dfeuer
Type: feature | Status: new
request |
Priority: normal | Milestone: 8.2.1
Component: Core | Version: 8.0.1
Libraries |
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): Phab:D3031 | Wiki Page:
-------------------------------------+-------------------------------------
Some functors support implementations of `liftA2` that are considerably
faster than the usual definition. Furthermore, some people see `liftA2` as
more intuitive and fundamental to the idea of `Applicative` than `<*>` is.
This has been discussed on the libraries list in
https://mail.haskell.org/pipermail/libraries/2017-January/027579.html and
(as an official proposal) in
https://mail.haskell.org/pipermail/libraries/2017-January/027612.html. All
who expressed an opinion favored the proposal. One (David Menendez)
specified that his support was weak. The others (Conal Elliot, Kris
Nuttycombe, Wren Romano, Bardur Arantsson, and Mario Blažević) either
supported the proposal strongly or merely indicated they were "+1". Conal
Elliot wrote:
[[BR]]
[[BR]]
> +1.
>
> I also sometimes define a specialized `liftA2` and then use it to define
> `(<*>)`, which then gets used to define the real `liftA2`.
>
> I think of `liftA2` as playing a role similar to `foldMap` and
`traverse`, while
> `(<*>)` corresponds to `fold` and `sequenceA`. The first three self-
compose
> nicely: `liftA2.liftA2.liftA2`, `foldMap.foldMap.foldMap`, and
> `traverse.traverse.traverse`. With functor composition, it's so much
nicer to
> write `liftA2.liftA2` (in the style of `Functor`, `Foldable`, and
`Traversable`)
> rather than `liftA2 (<*>)`.
[[BR]]
Wren Romano wrote
[[BR]]
[[BR]]
> I'm also all for adding liftA2 to the class and have noticed this
> inefficiency/asymmetry when working on the class hierarchies for other
> languages
[[BR]]
Kris NuttyCombe wrote
[[BR]]
[[BR]]
> I'm in favor of this change. From my perspecive, liftA2 is actually the
> fundamental Applicative operation, an <*> is merely a convenient
> isomorphism. When I'm teaching, showing the symmetry between the
following
> always seems to help students:
>
> fmap :: (a -> b) -> f a -> f b
> liftA2 :: (a -> b -> c) -> f a -> f b -> f c
> flip (>>=) :: (a -> f b) -> f a -> f b
>
> <*> is obviously exceptionally useful in practice. But liftA2 seems like
the
> more essential shape of that operation.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13191>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list