<div dir="ltr">So to catch up:<div><br></div><div>* I need to learn how to spell separator :)</div><div>* Indeed, the argument order should be intersperse(Sep, Xs), not the other way around. This looks consistent with most List functions.</div><div><br></div><div>* On Joe's comments of why not simply a utility library:</div><div><br></div><div>This would have been fine, were it not for the fact that Erlang is miserably bad at handling ad-hoc utility libraries for other modules. There is no way I can hide joe_utils.erl since it is a globally known name. This creates lots of versioning problems down the road. In e.g., Standard ML or OCaml, I could just package the modules such that 'module JoeUtils' is not exported outside the scope of the individual libraries and applications. But Erlang is not that language.</div><div><br></div><div>I also think intersperse/intercalate are so often used they shouldn't be in everyones utils library but should be put in the stdlib base.</div><div><br></div><div>* On Richard's comments of other uses than for a string:</div><div><br></div><div>The obvious use in Erlang is to produce iolist() types for binary data: intersperse($, [<<"a">>, <<"b">>, <<"c">>]) is relatively common in my code. The slightly less obvious use is to interleave a simplifier step in between every optimization step of a compiler, but I've only done that once in my life and I'm not sure it is that useful :)</div><div><br></div><div>One could argue we should just have tooling such as Hughes-combinators[0] for output rather than the singular intersperse function, but it is by the far the missing tool in the toolbox when trying to use standard Erlang as were it a pretty-printing combinator library.</div><div><br></div><div>* On the name choice of 'intersperse/intercalate':</div><div><br></div><div>I think the semantics I'm aiming for is so close to the OCaml(Core)/Haskell implementations I'm willing to reuse that name. Another valid name is 'join' which is common in many other languages. I don't think one is better than the other, but the FP roots in me says we should adopt FP-language naming.</div><div><br></div><div>NEXT STEP:</div><div><br></div><div>I'd like to produce the necessary PR for 'intersperse' first, which gives me an idea of where to put changes. This builds a small unit of work which should be easy to make concrete. We can always augment this with additional functions later.' We need at least:</div><div><br></div><div>* The implementation in lists.erl (I don't think we need to make it fast right away, so plain Erlang it is)</div><div>* Documentation of the function, with examples</div><div>* Tests with good coverage of the function.</div><div><br></div><div>Once this is done, adding 'intercalate' is easy, but the question is if it is needed since once can just 'append' after having interspersed. The power of having a special function is that it is amenable to certain optimizations if they are kept as a larger block.</div><div><br></div><div>[0] The thing I have in mind here is John Hughes "The Design of a Pretty-printing library" <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.8777">http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.8777</a><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 2, 2016 at 3:47 PM, Jesper Louis Andersen <span dir="ltr"><<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div><div><div><div>Hi Erlangers,<br><br></div>I'd really like to add two functions to the lists module from Haskell:<br><br></div>intersperse(List, Seperator) produces a list where each element is separated by separator, i.e.<br><br></div>X = [1,2,3]<br></div>[1, x, 2, x, 3] = lists:intersperse(X, x),<br><br></div>and it's cousin, intercalate(ListOfLists, Separator) is append(intersperse(ListOfLists, Seperator)), i.e,<br><br></div>Y = ["a", "b", "c"]<br></div>"a, b, c" = lists:intercalate(Y, ", "),<br><br></div>The implementations are straightforward and easy to write tests for, even property based tests if needed.<br><br></div>The rationale for this proposal is that I find myself implementing this function again and again in every project I write, and it is highly generic. It belongs in a typical list module. OCaml libraries add it. Haskell's Data.List has it. I believe Erlang, being a practical language, should have it as well.<br><br></div>Thoughts?<span class="HOEnZb"><font color="#888888"><br><br><div><div><div><div><div><div><div><div><div><div><div><div><div>-- <br><div>J.</div>
</div></div></div></div></div></div></div></div></div></div></div></div></div></font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">J.</div>
</div>