import java.util.function.*; interface Monad { Monad bind(Function> fn); } class maybe implements Monad { boolean valid; T value; maybe(boolean v, T val) { valid = v; value = val; } maybe() { valid = false; value = null; } public Monad bind(Function> fn) { if (valid) { return fn.apply(value); } else { return None(); } } public static maybe Just(U value) { return new maybe(true, value); } public static maybe None() { return new maybe(); } public String toString() { if (valid) { return "Some(" + value.toString() + ")"; } else { return "None()"; } } } public class monad { static maybe incEven(Integer j) { if (j % 2 == 0) { return maybe.None(); } else { return maybe.Just(j + 1); } } static maybe half(Integer j) { return maybe.Just(j / 2); } public static void main(String[] args) { for (int i=0; i<20; i++) { Monad some = maybe.Just(i); Monad g = some.bind((j) -> incEven(j)); Monad h = g.bind((j) -> half(j)); Monad k = h.bind((j) -> incEven(j)); System.out.println(k); } } }