<div dir="ltr"><div>I think your function is a possible candidate for the decorate-sort-undecorate paradigm, like sortOn in base [1].</div><div><br></div><div><span style="font-family:monospace">classifyByProjection ∷ Ord π ⇒ (a → π) → [a] → [[a]]<br>classifyByProjection f = (map . map) snd . List.groupBy ((==) `on` fst) . List.sortBy (comparing fst) . map (\x -> let y = f x in y `seq` (y, x))</span></div><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">That way the function <font face="monospace">f<font face="arial,sans-serif"> is only evaluated once for each element in the input list. <br></font></font></font></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif"><font face="monospace"><font face="arial,sans-serif">I have not benchmarked this.<br></font></font></font></span></div><div><br></div><div>1 - <a href="https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-List.html#v:sortOn">https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-List.html#v:sortOn</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Op ma 24 aug. 2020 om 14:49 schreef Ignat Insarov <<a href="mailto:kindaro@gmail.com">kindaro@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Andreas, then how do you feel about adding that one?<br>
<br>
    classifyByProjection ∷ Ord π ⇒ (a → π) → [a] → [[a]]<br>
    classifyByProjection f = List.groupBy ((==) `on` f) . List.sortBy<br>
(compare `on` f)<br>
<br>
Having thought about it, I have come to agree that it is usually not<br>
hard to define a suitable projection function.<br>
<br>
On Mon, 24 Aug 2020 at 12:39, Andreas Abel <<a href="mailto:andreas.abel@ifi.lmu.de" target="_blank">andreas.abel@ifi.lmu.de</a>> wrote:<br>
><br>
> This cannot be done efficiently.  I'd extend the equivalence relation to<br>
> a total order and then use sort and group.<br>
><br>
> -1 to adding to the standard libraries.  How about publishing this as a<br>
> (well discoverable) package on hackage and see how popular it gets?<br>
><br>
> On 2020-08-20 19:59, Ignat Insarov wrote:<br>
> > Hello.<br>
> ><br>
> > There has been [a question on Stack Overflow][1] asking for a way to group a<br>
> > list by an equivalence relation. Several answers were proposed over time, and I<br>
> > too [have offered a variant][2]. [I also wrote a benchmark.][3]<br>
> ><br>
> > I propose that the function be added to the standard libraries.<br>
> ><br>
> > [1]: <a href="https://stackoverflow.com/q/8262179" rel="noreferrer" target="_blank">https://stackoverflow.com/q/8262179</a><br>
> > [2]: <a href="https://stackoverflow.com/a/57761458" rel="noreferrer" target="_blank">https://stackoverflow.com/a/57761458</a><br>
> > [3]: <a href="https://github.com/kindaro/classify-benchmark.git" rel="noreferrer" target="_blank">https://github.com/kindaro/classify-benchmark.git</a><br>
> > _______________________________________________<br>
> > Libraries mailing list<br>
> > <a href="mailto:Libraries@haskell.org" target="_blank">Libraries@haskell.org</a><br>
> > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
> ><br>
> _______________________________________________<br>
> Libraries mailing list<br>
> <a href="mailto:Libraries@haskell.org" target="_blank">Libraries@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org" target="_blank">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
</blockquote></div>