Proposal: add liftA4 and liftA5 to match liftM4 and liftM5
Edward Kmett
ekmett at gmail.com
Thu Jul 14 19:07:48 UTC 2016
Given the long discussion we've had here, I'll make a call from the
standpoint of the CLC and say we'd happily accept a patch that added them.
-Edward
On Thu, Jul 14, 2016 at 2:38 PM, Conal Elliott <conal at conal.net> wrote:
> Any recent thoughts on adding liftA4 and liftA5 to Control.Applicative?
>
> On Sat, Nov 8, 2014 at 11:39 AM, Edward Kmett <ekmett at gmail.com> wrote:
>
>> We have two competing tensions that have been guiding the work so far,
>> which is scattered across a few dozen different proposals and patches in
>> Phab and is alarmingly intricate to detail.
>>
>> We've generally been guided by the notion you suggest here. In the wake
>> of the AMP, the 'M' suffix really comes to mean the minimal set of effects
>> needed to get the effect. This lets us generalize large numbers of
>> combinators in Control.Monad (e.g. when/unless/guard) to 'just work' in
>> more contexts.
>>
>> However, we also have to balance this carefully against two other
>> concerns:
>>
>> 1.) Not breaking user code silently in undetectable ways.
>>
>> This is of course the utmost priority. It guides much of the AMP,
>> including the 'backwards' direction of most of the dependencies. e.g. The
>> reality is a large number of folks wrote (*>) = (>>) in their code, so e.g.
>> if we defined (>>) = (*>), we'd get a large chunk of existing production
>> code that just turns into infinite loops. We can always do more later as we
>> find it is safe, but "first do no harm."
>>
>> 2.) Not introducing rampant performance regressions.
>>
>> David Feuer has been spending untold hours on this, and his work there is
>> a large part of the source of endless waves of proposals he's been putting
>> forth.
>>
>> Considering `liftM2` as 'redundant' from `liftA2` can be dangerous on
>> this front.
>>
>> The decision of if we can alias liftM3 to liftA3 needs to be at least
>> *partially* guided by the question of whether the latter is a viable
>> replacement in practice. I'm not prepared to come down on one side of that
>> debate without more profiling data.
>>
>> Adding liftA4, liftA5 runs afoul of neither of these caveats. Aliasing
>> liftMn to liftAn is something that *potentially* runs afoul of the
>> latter, and is something that we don't have to do in a frantic rush. The
>> world won't end if we play it safe and don't get to it in time for 7.10.
>>
>> -Edward
>>
>> On Sat, Nov 8, 2014 at 7:42 AM, Andreas Abel <abela at chalmers.se> wrote:
>>
>>> I am a bit alert about this discussion because it seems that we have
>>> quite different ideas about how the AMP implementation should affect the
>>> base libraries.
>>>
>>> 1. Where can we see and discuss the proposed changes?
>>>
>>> Not on https://www.haskell.org/haskellwiki/Functor-
>>> Applicative-Monad_Proposal
>>>
>>> Not on https://ghc.haskell.org/trac/ghc/ticket/9586
>>>
>>> 2. Imho, the reasonable thing is to
>>>
>>> rewrite all of F/A/M base functions such that they use the minimal
>>> F/A/M constraints.
>>>
>>> This of course includes
>>>
>>> liftM :: (Functor m) => (a -> b) -> m a -> m b
>>> liftM2 :: (Applicative m) => (a -> b -> c) -> m a -> m b -> m c
>>>
>>> and sequence and friends even if the M postfix can then "only explained
>>> historically" (HT).
>>>
>>> One can say "M" stands for "effectful", but the minimal type class to
>>> realize the effect is chosen from F/A/M.
>>>
>>> If we burn bridges, we should do it properly.
>>>
>>> Cheers,
>>> Andreas
>>>
>>>
>>> On 07.11.2014 20:35, Edward Kmett wrote:
>>>
>>>> I don't want them for rewriting liftM4 and liftM5, I want them in their
>>>> own right.
>>>>
>>>> It doesn't do anyone any good to just have random asymmetries in the API
>>>> like that.
>>>>
>>>> It just means a user goes to reach for a tool, doesn't find it and
>>>> flails around.
>>>>
>>>> -Edward
>>>>
>>>> On Fri, Nov 7, 2014 at 1:37 PM, John Lato <jwlato at gmail.com
>>>> <mailto:jwlato at gmail.com>> wrote:
>>>>
>>>> I still don't think it's worth adding liftA4 and liftA5 just so that
>>>> liftM4+ can be rewritten.
>>>>
>>>> Very weakly -0.1
>>>>
>>>> On Fri Nov 07 2014 at 10:24:27 AM David Feuer <
>>>> david.feuer at gmail.com
>>>> <mailto:david.feuer at gmail.com>> wrote:
>>>>
>>>> Another point: using `liftA` or `liftM`, specialized to the
>>>> relevant type, may reduce code size in some cases. With f <$> a
>>>> <*> b <*> c and such, you have to hope that you either get some
>>>> benefit from the inlining or that CSE is able to save you from
>>>> the duplication.
>>>>
>>>> On Fri, Nov 7, 2014 at 7:47 AM, Jacques Carette
>>>> <carette at mcmaster.ca <mailto:carette at mcmaster.ca>> wrote:
>>>>
>>>> On 2014-11-07 5:30 AM, Henning Thielemann wrote:
>>>>
>>>>
>>>> On Fri, 7 Nov 2014, Andreas Abel wrote:
>>>>
>>>> I hope the same happens for sequence, mapM and the
>>>> like!
>>>>
>>>> sequence :: (Applicative m) => [m a] -> m [a]
>>>> sequence = foldr (\ x xs -> (:) <$> x <*> xs)
>>>> (pure [])
>>>>
>>>>
>>>> Actually, this is an example, where liftA2 shows its
>>>> advantage:
>>>>
>>>> sequence = foldr (liftA2 (:)) (pure [])
>>>>
>>>> This looks much clearer to me than decoding the mixture
>>>> of infix and uninfixed infix operators. It simply says,
>>>> that 'sequence' is like 'id = foldr (:) []' but with
>>>> everything lifted to an applicative functor.
>>>>
>>>>
>>>> I agree. I have lots of code which looks really clean
>>>> because I can use liftA2 (and even liftA3) in exactly the
>>>> way above. Having to eta expand everything obscures the
>>>> real meat of what is going on.
>>>>
>>>> Jacques
>>>>
>>>> _________________________________________________
>>>> Libraries mailing list
>>>> Libraries at haskell.org <mailto:Libraries at haskell.org>
>>>> http://www.haskell.org/__mailman/listinfo/libraries
>>>> <http://www.haskell.org/mailman/listinfo/libraries>
>>>>
>>>>
>>>> _________________________________________________
>>>> Libraries mailing list
>>>> Libraries at haskell.org <mailto:Libraries at haskell.org>
>>>> http://www.haskell.org/__mailman/listinfo/libraries
>>>> <http://www.haskell.org/mailman/listinfo/libraries>
>>>>
>>>>
>>>> _______________________________________________
>>>> Libraries mailing list
>>>> Libraries at haskell.org <mailto:Libraries at haskell.org>
>>>> http://www.haskell.org/mailman/listinfo/libraries
>>>>
>>>>
>>>>
>>> --
>>> Andreas Abel <>< Du bist der geliebte Mensch.
>>>
>>> Department of Computer Science and Engineering
>>> Chalmers and Gothenburg University, Sweden
>>>
>>> andreas.abel at gu.se
>>> http://www2.tcs.ifi.lmu.de/~abel/
>>>
>>
>>
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://www.haskell.org/mailman/listinfo/libraries
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160714/f41babd4/attachment.html>
More information about the Libraries
mailing list