public class Currier { public interface CurriableFunctor { RET evaluate(ARG1 arg1, ARG2 arg2); } public interface CurriedFunctor { RET evaluate(ARG2 arg); } final CurriableFunctor functor; public Currier(CurriableFunctor fn) { functor = fn; } public CurriedFunctor curry(final ARG1 arg1) { return new CurriedFunctor() { public RET evaluate(ARG2 arg2) { return functor.evaluate(arg1, arg2); } }; } public static void main(String[] args) { Currier.CurriableFunctor add = new Currier.CurriableFunctor() { public Integer evaluate(Integer arg1, Integer arg2) { return new Integer(arg1.intValue() + arg2.intValue()); } }; Currier currier = new Currier(add); Currier.CurriedFunctor add5 = currier.curry(new Integer(5)); System.out.println(add5.evaluate(new Integer(2))); } }