Expected distribution of lambda sizes (Re: Syntax poll, take 2)

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Jun 15 07:13:51 PDT 2011


On 15/06/11 14:22, Ben Evans wrote:
> On Tue, Jun 14, 2011 at 8:26 PM, Jack Moxley<jack at moxley.co.uk>  wrote:
>
>> Whatever syntax is chosen remember that it WILL be abused, and some poor
>> sod like me is going to have to find the issue and then teach the
>> perpetrator as to why it was abuse.
>>
>> To sum up, expect the unexpected.
>>
>>
> This is precisely why we need a syntax containing a "Yoo-hoo, I'm a lambda"
> character.
>
> The syntax should favour the poor maint programmer - who is sooner or later
> going to be us when woken at 0300 and hungover.
>
> As we now seem to be debating alternatives (despite Brian's instructions),
> here's the blog post I wrote about this:
>
> http://www.java7developer.com/blog/?p=326
Hi Ben,
I went through the examples in your blog entry - I think that the syntax 
in your post looks way more verbose than it is in practice; the first 
problem is that your example seems not to be correct, as it uses 
type-variable declaration syntax in a use-site position; i.e. stuff like:

.sort(#(Pair<T, V extends Comparable<T>>  l)(l.get(1)))


Is wrong, as 'V extends' cannot appear here. I think that what you want 
to achieve here is to push up constraints on V at the method declaration 
level, as follows:

<T, V extends Comparable<T>> List<V> schwarz(List<T> x, Function<T, 
Pair<T,V>> f) {
       return map(#{T w -> f.apply(w) }, x)
          .sort(#{Pair<T, V> l -> l.fst()})
          .map(#{Pair<T, V> l -> l.snd()});
    }

This is already way shorter than your version.

Secondly, note that you can take advantage of type-inference for lambda 
parameters, which further reduces your examples to:

<T, V extends Comparable<T>> List<V> schwarz(List<T> x, Function<T, 
Pair<T,V>> f) {
       return map(#{ w -> f.apply(w) }, x)
          .sort(#{ l -> l.fst()})
          .map(#{l -> l.snd()});
    }

Or, with method references:

<T, V extends Comparable<T>> List<V> schwarz(List<T> x, Function<T, 
Pair<T,V>> f) {
       return map(#{ w -> f.apply(w) }, x)
          .sort( Pair<T,V>#fst() )
          .map( Pair<T,V>#snd() );
    }

Maurizio
> Thanks,
>
> Ben
>



More information about the lambda-dev mailing list