<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 5 February 2018 at 12:22, Evan Laforge <span dir="ltr"><<a href="mailto:qdunkan@gmail.com" target="_blank">qdunkan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I have my own list library with a bunch of things like this.  I think<br>
it's what most people do, and some upload them to hackage, e.g.<br>
utility-ht or the split package, or data-ordlist.<br></blockquote><div><br></div><div>The irony is that theoretically you can find a Haskell package or implementation of whatever you can imagine but quite often it takes more time to discover it than writing your own. And then uploading what you wrote to hackage compounds the problem. A hoogle search only shows the groupBy in base, signature search also does not yield other results, it seems hoogle does not cover those other packages. After writing my own and spending quite a bit of time I could find two other similar implementations of groupBy, one in "utility-ht" package and the other in "data-list-sequences" but they don't turn up in hoogle search. It looks like hoogle database should cover more packages, or maybe the search has some issues. This state of affairs encourages people to write their own rather than find and reuse stuff. My example in this email can be dismissed as a small one but I think it is a larger problem.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
You can probably find something like this in 'split', or if not, that<br>
might be a good place to contribute it.<br></blockquote><div><br></div><div>Yes, that is the fallback option I was considering, split seems to be the most comprehensive of all such list related packages. <br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I have a bunch of grouping functions too, which I use all the time, so<br>
if there's some kind of general list grouping package then maybe I<br>
could put them there.<br></blockquote><div><br></div><div>It will be a great service to other Haskell explorers if we can consolidate all such packages and make one standard package covering most use cases and deprecate the other packages. Also it may be a good idea to have a see-also or related packages kind of field in packages so that discovery is easy.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
On the other hand, this sort of thing is pretty individual, so it<br>
doesn't seem so bad for each person to have their own local library.<br>
That way you know it fits your style.  Ultimately I think that's why<br>
none of the split functions made it into Data.List, every person has a<br>
slightly different idea of what it should be.<br></blockquote><div><br></div><div>I thought that rollingGroupBy would have been a better default option as it can practically subsume the purpose of groupBy. groupBy in base is not well documented, and intuitively many think it works the way rollingGroupBy works i.e. compare two successive elements rather than comparing a fixed element. See this stack overflow question <a href="https://stackoverflow.com/questions/45654216/haskell-groupby-function-how-exactly-does-it-work">https://stackoverflow.com/questions/45654216/haskell-groupby-function-how-exactly-does-it-work</a> , I thought the same way. I guess if we compare two successive elements, by transitive equality the existing groupBy implementation will practically get covered by that, not strictly compatible but should serve all practical purposes. That was the point why I was asking to consider having it in base alongside groupBy. It seems more useful, general and intuitive than the existing groupBy.</div><div><br></div><div>-harendra</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><div class="gmail-m_-4677337184613970770h5"><br>
On Sun, Feb 4, 2018 at 7:50 PM, Harendra Kumar <<a href="mailto:harendra.kumar@gmail.com" target="_blank">harendra.kumar@gmail.com</a>> wrote:<br>
> Hi,<br>
><br>
> For a small problem, I was looking for a groupBy like function that groups<br>
> based on a predicate on successive elements but I could not find one. I<br>
> wrote these little functions for that purpose:<br>
><br>
> -- | Like span, but with a predicate that compares two successive elements.<br>
> The<br>
> -- span ends when the two successive elements do not satisfy the predicate.<br>
> rollingSpan :: (a -> a -> Bool) -> [a] -> ([a], [a])<br>
> rollingSpan _ xs@[] = (xs, xs)<br>
> rollingSpan _ xs@[_] = (xs, [])<br>
> rollingSpan p (x1:xs@(x2:_))<br>
>     | p x1 x2 =<br>
>         let (ys, zs) = rollingSpan p xs<br>
>         in (x1 : ys, zs)<br>
>     | otherwise = ([x1], xs)<br>
><br>
> -- | Like 'groupBy' but with a predicate that compares two successive<br>
> elements.<br>
> -- A group ends when two successive elements do not satisfy the predicate.<br>
> rollingGroupBy :: (a -> a -> Bool) -> [a] -> [[a]]<br>
> rollingGroupBy _ [] = []<br>
> rollingGroupBy cmp xs =<br>
>     let (ys, zs) = rollingSpan cmp xs<br>
>     in ys : rollingGroupBy cmp zs<br>
><br>
> Are there any existing functions that serve this purpose or is there any<br>
> simpler way to achieve such functionality? If not, where is the right place<br>
> for these, if any. Can they be included in Data.List in base?<br>
><br>
> Thanks,<br>
> Harendra<br>
><br>
</div></div>> ______________________________<wbr>_________________<br>
> ghc-devs mailing list<br>
> <a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bi<wbr>n/mailman/listinfo/ghc-devs</a><br>
><br>
</blockquote></div><br></div></div>