experimental Implementation of Haskell List Functions with Java 8

Luc Duponcheel luc.duponcheel at gmail.com
Sat May 19 05:39:57 PDT 2012


Nice!
On May 19, 2012 1:04 PM, "Sven Eric Panitz" <sveneric at panitz.name> wrote:

> Hello all,
> this is my first post to this list and I am new to the list. So please
> excuse, if I bring up topics,
> which have allready been discussed ages ago.
>
> After a first look at the current status of project Lambda
> <http://openjdk.java.net/projects/lambda/> JSR 335, I found it a nice
> exercise to implement the complete Haskell Prelude list functions with
> java 8.
>
> The result of my efforts can be found on my web site at:
> http://panitz.name/paper/haskellPrelude
>
> With my class haskell.data.Iterables, now objects of type Iterable<A>
> can make use of all Haskell list functions.
> Mayby this quick implementation is interesting for those guys, that
> develope the library for Java 8.
>
>
>
> I am not sure, but I might have found a bug in the current lambda
> compiler. At least I get a
> ClassCastException during runtime, which I cannot explain.
>
> It comes up in my implementation of the function »permutations« (which
> is the most complicated
> of all the Haskell functions I implemented).
>
> The following implementation in terms of a private auxiliary method
> interleave_ compiles und runs
> without problem:
>
>   static public <A> Iterable<Iterable<A>> permutations(Iterable<A> xs0){
>     Function2<Iterable<A>,Iterable<A>,Iterable<Iterable<A>>> perms =
>     (tso,is) -> {
>       if (tso.isEmpty()) return new Nil<Iterable<A>>();
>       A t = head(tso);
>       Iterable<A> ts = tail(tso);
>
>       return
>
> foldr((xs,r)->interleave_(t,ts,(u)->u,xs,r).e2,perms.eval(ts,cons(t,is)),permutations(is));
>     };
>
>     return cons(xs0,perms.eval(xs0,new Nil<A>()));
>   }
>   static private <A> Tuple2<Iterable<A>,Iterable<Iterable<A>>> interleave_
>          (A t,Iterable<A> ts,Function1<Iterable<A> ,Iterable<A>>f
> ,Iterable<A> xs,Iterable<Iterable<A>> r){
>     if (xs.isEmpty()) return new
> Tuple2<Iterable<A>,Iterable<Iterable<A>>>(ts,r);
>     A y = head(xs);
>     Iterable<A> ys = tail(xs);
>     Tuple2<Iterable<A>,Iterable<Iterable<A>>>
> uszs=interleave_(t,ts,(x)->f.eval(cons(y,x)),ys,r);
>     return new
>
> Tuple2<Iterable<A>,Iterable<Iterable<A>>>(cons(y,uszs.e1),cons(f.eval(cons(t,cons(y,uszs.e1))),uszs.e2));
>   }
>
> (Tuple2 is a generic class for pairs, Function(1-5) are interfaces for
> functions of arity 1 to 5.
> These are found as well on my web site.)
>
> The following alternative Implementation with a local function for the
> auxiliary function interleave_,
> compiles but gets a ClassCastException during runtime:
>
>   static public <A> Iterable<Iterable<A>> permutations2(Iterable<A> xs0){
>     Function2<Iterable<A>,Iterable<A>,Iterable<Iterable<A>>> perms =
>     (tso,is) -> {
>       if (tso.isEmpty()) return new Nil<Iterable<A>>();
>
>       Function5<A,Iterable<A>,Function1<Iterable<A>
>
> ,Iterable<A>>,Iterable<A>,Iterable<Iterable<A>>,Tuple2<Iterable<A>,Iterable<Iterable<A>>>>
> interleave_ =
>       (t,ts,f,xs,r) -> {
>         if (xs.isEmpty()) return new
> Tuple2<Iterable<A>,Iterable<Iterable<A>>>(ts,r);
>         A y = head(xs);
>         Iterable<A> ys = tail(xs);
>         Tuple2<Iterable<A>,Iterable<Iterable<A>>>
> uszs=interleave_.eval(t,ts,(x)->f.eval(cons(y,x)),ys,r);
>         return new
>
> Tuple2<Iterable<A>,Iterable<Iterable<A>>>(cons(y,uszs.e1),cons(f.eval(cons(t,cons(y,uszs.e1))),uszs.e2));
>       };
>
>       A t = head(tso);
>       Iterable<A> ts = tail(tso);
>
>       return
>
> foldr((xs,r)->interleave_.eval(t,ts,(u)->u,xs,r).e2,perms.eval(ts,cons(t,is)),permutations(is));
>     };
>
>     return cons(xs0,perms.eval(xs0,new Nil<A>()));
>   }
>
> Regards,
> Sven Eric
>
>


More information about the lambda-dev mailing list