import java.util.function.Function;
interface Monad<T> {
public <U> Monad<U> bind(Function<T, Monad<U>> f);
}
class Maybe<T> implements Monad<T> {
public Maybe(T val) {
this.val = val;
}
public T getVal() {
return val;
}
@Override
public <U> Monad<U> bind(Function<T, Monad<U>> f) {
if (val == null)
return new Maybe<U>(null);
return f.apply(val);
}
private final T val;
}
public class MonadApp {
public static void main
(String[] args
) { Maybe<Integer> x = new Maybe<>(5);
Monad<Integer> y = x.bind(v -> new Maybe<Integer>(v+1))
.bind(v -> new Maybe<Integer>(v*2));
System.
out.
println( ((Maybe
<Integer
>)y
).
getVal() ); }
}
aW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKCmludGVyZmFjZSBNb25hZDxUPiB7CglwdWJsaWMgPFU+IE1vbmFkPFU+IGJpbmQoRnVuY3Rpb248VCwgTW9uYWQ8VT4+IGYpOwp9CgpjbGFzcyBNYXliZTxUPiBpbXBsZW1lbnRzIE1vbmFkPFQ+IHsKCXB1YmxpYyBNYXliZShUIHZhbCkgewoJCXRoaXMudmFsID0gdmFsOwoJfQoJCglwdWJsaWMgVCBnZXRWYWwoKSB7CgkJcmV0dXJuIHZhbDsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgPFU+IE1vbmFkPFU+IGJpbmQoRnVuY3Rpb248VCwgTW9uYWQ8VT4+IGYpIHsKCQlpZiAodmFsID09IG51bGwpCgkJCXJldHVybiBuZXcgTWF5YmU8VT4obnVsbCk7CgkJcmV0dXJuIGYuYXBwbHkodmFsKTsKCX0KCQoJcHJpdmF0ZSBmaW5hbCBUIHZhbDsKfQoKcHVibGljIGNsYXNzIE1vbmFkQXBwIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlNYXliZTxJbnRlZ2VyPiB4ID0gbmV3IE1heWJlPD4oNSk7CgkJTW9uYWQ8SW50ZWdlcj4geSA9IHguYmluZCh2IC0+IG5ldyBNYXliZTxJbnRlZ2VyPih2KzEpKQoJCSAgICAgICAgICAgICAgICAgICAgLmJpbmQodiAtPiBuZXcgTWF5YmU8SW50ZWdlcj4odioyKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCAoKE1heWJlPEludGVnZXI+KXkpLmdldFZhbCgpICk7Cgl9Cn0=