<div><div dir="auto">Time to put infix operators into TypeScript, first, then?</div><br><div class="gmail_quote"><div>On Sat, 3 Feb 2018 at 04:25, kdex <<a href="mailto:kdex@kdex.de">kdex@kdex.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">People in the C++ community have been using overloaded operators since the<br>
1980's, and I wouldn't say that different semantics for the same operator have<br>
been a bad idea at all, given that the operator handles completely different<br>
types (that can and should be statically analyzable).<br>
<br>
I wouldn't even think that these features are abused in the C++ community:<br>
Think vector/matrix operations, for instance. Very expressive stuff.<br>
<br>
Depending on the application, it could be nicer for Array + Array to become<br>
Array(Array, Array) rather than Array(...Array, ...Array). Depends on your use<br>
case. As for function composition, it's a matter of preference if A + B is<br>
supposed to mean (...args) => A(B(...args)) or rather (...args) =><br>
B(A(...args)).<br>
<br>
My point is, as long as there is a statically analyzable definition for how<br>
operators are supposed to behave for a given set of input types, there's no<br>
reason not to give programmers the ability to provide such definitions.<br>
<br>
But again, these discussions will be much more relevant if proposals such as<br>
[this one](<a href="https://github.com/sirisian/ecmascript-types" rel="noreferrer" target="_blank">https://github.com/sirisian/ecmascript-types</a>) are discussed for<br>
standardization at some point.<br>
<br>
On Saturday, February 3, 2018 4:57:34 AM CET Naveen Chawla wrote:<br>
> I don't like the idea of custom operators only because of readability of<br>
> code - it can be different for different pieces of code, and so I think it<br>
> is a larger surface area for bugs, so I think it would be a net negative.<br>
><br>
> However, I do like the idea of allowing e.g. `+` to be used intuitively and<br>
> consistently (i.e. with a fixed meaning) between certain data types that<br>
> are not currently supported, e.g.:<br>
><br>
> Array + Array (array concatenation)<br>
> Function + Function (function composition)<br>
><br>
> On Fri, 2 Feb 2018 at 22:02 Michael Haufe <<a href="mailto:tno@thenewobjective.com" target="_blank">tno@thenewobjective.com</a>> wrote:<br>
> > How would operator precedence work? Would we be restricted to 2-argument<br>
> > functions only?<br>
> ><br>
> > On Fri, Feb 2, 2018 at 5:55 AM, Thomas Grainger <<a href="mailto:tagrain@gmail.com" target="_blank">tagrain@gmail.com</a>> wrote:<br>
> >> I'm porting this from the TypeScript issue tracker, original from:<br>
> >> <a href="https://github.com/Microsoft/TypeScript/issues/2319#issue-60851953" rel="noreferrer" target="_blank">https://github.com/Microsoft/TypeScript/issues/2319#issue-60851953</a><br>
> >><br>
> >> Since it's very unlikely that the extension methods will ever be<br>
> >> implemented [in a call-site-rewrite<br>
> >> manner](<br>
> >> <a href="https://github.com/Microsoft/TypeScript/issues/9#issuecomment-74302592" rel="noreferrer" target="_blank">https://github.com/Microsoft/TypeScript/issues/9#issuecomment-74302592</a>),<br>
> >> please consider adding infix operators to enable writing in functional<br>
> >> style similarly to what can be done in Haskell:<br>
> >><br>
> >> Monoids<br>
> >><br>
> >> ```js<br>
> >><br>
> >>     function '+' (left, right) {<br>
> >><br>
> >>        return left.concat(right);<br>
> >><br>
> >>     }<br>
> >><br>
> >>     [1, 2, 3] '+' [4, 5]; // [1, 2, 3, 4, 5]<br>
> >><br>
> >> ```<br>
> >><br>
> >> Monads<br>
> >><br>
> >> ```js<br>
> >><br>
> >>     function '>>=' (promise, bind) {<br>
> >><br>
> >>        return promise.then(bind);<br>
> >><br>
> >>     }<br>
> >>     $.get('/get') '>>=' x => $.post('/save', x + 1)<br>
> >><br>
> >> ```<br>
> >><br>
> >> Functors<br>
> >><br>
> >> ```js<br>
> >><br>
> >>     function '.' (inner, outer) {<br>
> >><br>
> >>        return function(value: a) : c {<br>
> >><br>
> >>           return outer(inner(value))<br>
> >><br>
> >>        }<br>
> >><br>
> >>     }<br>
> >><br>
> >>     function f(x) { }<br>
> >>     function g(y) { }<br>
> >>     (f '.' g)(x); // z<br>
> >><br>
> >> ```<br>
> >><br>
> >><br>
> >><br>
> >> Thomas Grainger<br>
> >><br>
> >> _______________________________________________<br>
> >> es-discuss mailing list<br>
> >> <a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
> >> <a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
> ><br>
> > _______________________________________________<br>
> > es-discuss mailing list<br>
> > <a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
> > <a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div></div>