experimental Implementation of Haskell List Functions with Java 8
Sven Eric Panitz
sveneric at panitz.name
Sat May 19 04:02:57 PDT 2012
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