[Removed the homepage from this repo bjorn@bringert.net**20050622152941] { hunk ./index.html 1 - -
-We present a library that adds curried higher order functions and tuple -types to Generic Java.
- -Many of these ideas are taken from the functional programming -language Haskell.
- -If we have a type for functions, we can define higher-order functions -such as map, filter, foldr, foldl, zipWith, curry, uncurry, flip. We can -provide partial application.
- -In HOJ, functions are curried, that is, a n-argument function is -defined as a one-argument function that returns a (n-1)-argument -function. Unary (one-argument) functions are represented by the class -Fun<A,B>. Binary (two-argument) functions are represented -by the class Fun2<A,B,C>, which extends -Fun<A,Fun<B,C>>.
- -Functions can be applied using their apply() method. If apply() is called -with fewer arguments that the arity of the function, a new function is -returned. There are several method declared -for functions. Examples include compose(), which composes to functions -to a new function, flip() which reverses the order in which a binary -function takes its arguments and map() which applies a function to all -elements of iterator, returning a new iterator.
- -Basic functions such as Id (the identity function) and Const (a -constant function) are supplied.
- -We often need pairs (or triples, quads etc.), for things like symbol table -entries and coordinates.
- -The library contains classes such as Pair, the 2-tuple, and Triple, -the 3-tuple, (and Unit, the 0-tuple, and Cell, the 1-tuple). The tuple -classes also contain static functions such as zip (turns a tuple of -collections into a collection of tuples.)
- -All tuple classes are immutable, as it simplifies concurrent -programming, and no compelling arguments for making them mutable has -been found.
- -This is a simple grep-like utility that prints all lines -from System.in that matches a pattern given on the command line.
- -
-import java.util.regex.*;
-
-import io.*;
-import fun.*;
-import static fun.Filter.*;
-import static fun.Compose.*;
-import static fun.TakeWhile.*;
-import static fun.Not.*;
-import static fun.Eq.*;
-
-
-/**
- * Prints lines from System.in that that match a given regexp.
- */
-public class Grep {
- private static class Match extends Fun2<Matcher,String,Boolean> {
- public Boolean apply(Matcher matcher, String s) {
- return Boolean.valueOf(matcher.reset(s).matches());
- }
- }
-
- public static void main(String[] args) {
- Matcher matcher = Pattern.compile(".*"+args[0]+".*").matcher("");
- new Println(System.out).map(
- filter(new Match().apply(matcher),
- takeWhile(compose(not(), eq(null)),
- new ReadLine(System.in).repeat())));
- }
-}
-
-
--Example 3.1 from "Pizza into Java: Translating theory into practise" -by Martin Odersky and Philip Walder, rewritten using HOJ. -
- -
-import fun.Fun;
-
-class Radix {
- int n = 0;
- Fun<Character,Boolean> radix(final int r) {
- return new Fun<Character,Boolean> () {
- public Boolean apply(Character c) {
- n++;
- return new Boolean('0' <= c.charValue()
- && c.charValue() < '0'+r);
- }
- };
- }
- String test() {
- Fun<Character,Boolean> f = radix(8);
- return f.apply(new Character('0'))+" "+f.apply(new Character('9'))+" "+n;
- }
-}
-
-
-The original example (written in Pizza) is:
- -
-class Radix {
- int n = 0;
- (char)->boolean radix(int r) {
- return fun (char c)->boolean {
- n++; return '0' <= c && c < '0'+r;
- };
- }
- String test () {
- (char)->boolean f = radix(8);
- return f('0')+" "+f('9')+" "+n;
- }
-}
-
-
-The development version of HOJ is available in the -HOJ darcs repo. -Use darcs darcs to get it:
- --$ darcs get http://www.cs.chalmers.se/~bringert/darcs/hoj/ -- -
-The library is intended to be used with the version of -Java programming language supported by the -Java 1.5.0 -release. -
- -I gave a short presentation on HOJ -in the Topics in Computer Languages class.
- --JGA (Java Generic Algorithms), -http://jga.sourceforge.net/, -contains classes for unary and binary functions. The functions are not -curried and there are few higher order functions defined. -
- --Pizza into Java: Translating Theory into Practice, M. Odersky and P. Wadler, -1997. -The Pizza language extends Java to add genericity, higher-order functions -and algebraic types. The main difference between the higher-order functions -in Pizza and those in HOJ is that Pizza requires syntax extensions to Java, -whereas HOJ is a library. Also Pizza's funcions does not seem to be curried. -The genericity in Generic Java is based on that in Pizza. -
- -Bjorn Bringert, bjorn@bringert.net.
- -