Variants/case classes/algebraic data types/sums/oh my! (original) (raw)

forax at univ-mlv.fr forax at univ-mlv.fr
Sun Jun 12 18:12:35 UTC 2016


----- Mail original -----

De: "Vitaly Davidovich" <vitalyd at gmail.com> À: "John Rose" <john.r.rose at oracle.com> Cc: "Rémi Forax" <forax at univ-mlv.fr>, valhalla-dev at openjdk.java.net Envoyé: Dimanche 12 Juin 2016 19:30:21 Objet: Re: Variants/case classes/algebraic data types/sums/oh my!

On Saturday, June 11, 2016, John Rose < john.r.rose at oracle.com > wrote:

> On Jun 11, 2016, at 5:12 PM, forax at univ-mlv.fr wrote:

> > > > > > De: "John Rose" < john.r.rose at oracle.com > > > À: "Rémi Forax" < forax at univ-mlv.fr > > > Cc: "org openjdk" < org.openjdk at io7m.com >, valhalla-dev at openjdk.java.net > > Envoyé: Dimanche 12 Juin 2016 01:02:52 > > Objet: Re: Variants/case classes/algebraic data types/sums/oh my! > > Hi John, > > > >>> On Jun 11, 2016, at 4:18 AM, Remi Forax < forax at univ-mlv.fr > wrote: > >>> > >>> because K is reified, there will be two methods eval() at runtime, one > >>> specialized for K = 0 and an other for K = 1, > >>> which means that the switch will be constant fold (the real 'switch' is > >>> done when selecting the specialization). > >>> > >> That is an interesting use case for non-type class template parameters! > >> > > Here is another one, > > class ArrayList { > > final E[] array; > > int size; > > > > public <Consumer<? super E> U> void forEach(U consumer) { > > for(int i = 0; i < size; i++) {_ _> > consumer.accept(array[i]); > > } > > } > > }

> I think there are two simple ways to interpret your suggestion. One is to > split and specialize forEach by concrete consumer type, and one is to > specialize by consumer instance.

> public <_SpecializePerType U extends Consumer<? super E>> void forEach(U > consumer) {

> for(int i = 0; i < size; i++) {_ _> consumer.accept(array[i]); > } > } > public <_SpecializePerInstanceOf U extends Consumer<? super E>> void > forEach(U consumer) { > for(int i = 0; i < size; i++) {_ _> consumer.accept(array[i]); > } > }

> > In the snippet above, forEach is specialized by the value of the lambda > > taken as argument, which is another way to say that he code of forEach > > and > > the code of the lambda should be inlined together.

> Yes; function parameters to templates are an important organizing feature > for > C++ STL algorithms. The sort method is also a good candidate for such > treatment. C++ expresses per-type specialization using type parameters and > per-instance specialization using non-type parameters.

Goes without saying, but non-type parameters are very useful to propagate constants, possibly quite "far" with sufficient inlining, and open up more optimization opportunities. I'd love something similar in Java.

It remember me that you can 'constantify' everything you want in Java https://gist.github.com/anonymous/7cabe890a28547dad0401dc7883cc4a7

Rémi



More information about the valhalla-dev mailing list