import java.lang.String;
import java.lang.StringBuilder;
import java.lang.Integer;
import java.lang.System;
interface Function<A, B> {
public B apply(A x);
}
class List<A> {
private final A head;
private final List<A> tail;
private final int size;
// unit :: A -> M[A]
// public List(A x) -- implied by "new List<>(A...)"
// "List" happens to be *additive*, so we also offer a "zero" instance
// and a "plus" operation
// "zero", a neutral element for the "plus" operation
// public List() -- implied by "new List<>(A...)"
// "plus" concatenates two Lists
// plus :: (M[A], M[A]) → M[A]
// important properties regarding the zero:
// zero.plus(x) == x
// x.plus(zero) == x
public List<A> plus(List<A> that) {
if (this.size == 0) return that;
return new List<A>(this.head, this.tail.plus(that));
}
// a convenience constructor that hides excessive "plus"sing
// technically, we have to do something like:
// List<A> result = new List<>();
// for (A x : xs)
// result = result.plus(new List<>(x));
// this = result
// let's take the equivalent shortcut:
if (xs.length == 0) {
this.head = null;
this.tail = null;
this.size = 0;
}
else {
List<A> result = new List<A>();
for (int i = xs.length - 1; i > 0; i--) {
result = new List<A>(xs[i], result);
}
this.head = xs[0];
this.tail = result;
this.size = result.size + 1;
}
}
// an internal constructor to create the linked lists
private List(A x, List
<A
> xs
) { this.head = x;
this.tail = xs;
this.size = xs.size + 1;
}
// "bind"
// bind :: (M[A], A → M[B]) → M[B]
// can be implemented in terms of our "plus"
public <B> List<B> bind(Function<A, List<B>> f) {
if (this.size == 0) return new List<B>();
List<B> partialResult = this.tail.bind(f);
return f.apply(this.head).plus(partialResult);
}
// how about a nice "toString"?
StringBuilder sb = new StringBuilder();
sb.append("[");
if (this.size > 0) {
sb.append(this.head);
for (List<A> ptr = this.tail; ptr.size > 0; ptr = ptr.tail) {
sb.append(",");
sb.append(ptr.head);
}
}
sb.append("]");
return sb.toString();
}
}
public class Main {
public static void main
(String[] args
) {
// example: repeat each element
final Function
<String, List
<String
>> repeatEachElement
= new Function
<String, List
<String
>>() { @Override
public List
<String
> apply
(String s
) { return new List<String>(s, s);
}
};
final List<String> strings = new List<String>("foo", "bar", "baz");
System.
out.
println(strings.
bind(repeatEachElement
));
// example: square each element
final Function
<Integer, List
<Integer
>> square
= new Function
<Integer, List
<Integer
>>() { @Override
public List
<Integer
> apply
(Integer i
) { return new List<Integer>(i * i);
}
};
final List<Integer> numbers = new List<Integer>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
System.
out.
println(numbers.
bind(square
));
// --------------- //
// The Monad Laws: //
// --------------- //
// note: these aren't _proofs_ of correctnes,
// just some examples showing that they're probably correct.
// 1. "(unit x) >>= f ≡ f x" //
assert new List<Integer>(42).bind(square).toString() == square.apply(42).toString();
// 2. "m >>= unit ≡ m" //
final Function
<Integer, List
<Integer
>> unit
= new Function
<Integer, List
<Integer
>>() { @Override
public List
<Integer
> apply
(Integer i
) { return new List<>(i);
}
};
assert numbers.bind(unit).toString() == numbers.toString();
// 3. "(m >>= f) >>= g ≡ m >>= ( \x -> (f x >>= g) )" //
// m = numbers
// f = square
// g = stringify
final Function
<Integer, List
<String
>> stringify
= new Function
<Integer, List
<String
>>() { @Override
public List
<String
> apply
(Integer i
) { return new List<>(i.toString());
}
};
final Function
<Integer, List
<String
>> nested
= new Function
<Integer, List
<String
>>() { @Override
public List
<String
> apply
(Integer i
) { return square.apply(i).bind(stringify);
}
};
assert numbers.bind(square).bind(stringify).toString()
== numbers.bind(nested).toString();
}
}
aW1wb3J0IGphdmEubGFuZy5TdHJpbmc7CmltcG9ydCBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjsKaW1wb3J0IGphdmEubGFuZy5JbnRlZ2VyOwppbXBvcnQgamF2YS5sYW5nLlN5c3RlbTsKCmludGVyZmFjZSBGdW5jdGlvbjxBLCBCPiB7CiAgICBwdWJsaWMgQiBhcHBseShBIHgpOwp9CgpjbGFzcyBMaXN0PEE+IHsKCXByaXZhdGUgZmluYWwgQSAJCWhlYWQ7Cglwcml2YXRlIGZpbmFsIExpc3Q8QT4gCXRhaWw7Cglwcml2YXRlIGZpbmFsIGludAkJc2l6ZTsKCQoJLy8gdW5pdCA6OiBBIC0+IE1bQV0KCS8vIHB1YmxpYyBMaXN0KEEgeCkgLS0gaW1wbGllZCBieSAibmV3IExpc3Q8PihBLi4uKSIKCQoJLy8gIkxpc3QiIGhhcHBlbnMgdG8gYmUgKmFkZGl0aXZlKiwgc28gd2UgYWxzbyBvZmZlciBhICJ6ZXJvIiBpbnN0YW5jZSAKCS8vIGFuZCBhICJwbHVzIiBvcGVyYXRpb24KCQoJLy8gInplcm8iLCBhIG5ldXRyYWwgZWxlbWVudCBmb3IgdGhlICJwbHVzIiBvcGVyYXRpb24KCS8vIHB1YmxpYyBMaXN0KCkgIC0tIGltcGxpZWQgYnkgIm5ldyBMaXN0PD4oQS4uLikiCgkKCS8vICJwbHVzIiBjb25jYXRlbmF0ZXMgdHdvIExpc3RzCgkvLyAgICAgcGx1cyA6OiAoTVtBXSwgTVtBXSkg4oaSIE1bQV0KCS8vIGltcG9ydGFudCBwcm9wZXJ0aWVzIHJlZ2FyZGluZyB0aGUgemVybzoKCS8vICAgICB6ZXJvLnBsdXMoeCkgPT0geAoJLy8gICAgIHgucGx1cyh6ZXJvKSA9PSB4CglwdWJsaWMgTGlzdDxBPiBwbHVzKExpc3Q8QT4gdGhhdCkgewoJCWlmICh0aGlzLnNpemUgPT0gMCkgcmV0dXJuIHRoYXQ7CgkJcmV0dXJuIG5ldyBMaXN0PEE+KHRoaXMuaGVhZCwgdGhpcy50YWlsLnBsdXModGhhdCkpOwoJfQoJCgkvLyBhIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9yIHRoYXQgaGlkZXMgZXhjZXNzaXZlICJwbHVzInNpbmcKCXB1YmxpYyBMaXN0KEEuLi4geHMpIHsKCQkvLyB0ZWNobmljYWxseSwgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZToKCQkvLyAgICAgTGlzdDxBPiByZXN1bHQgPSBuZXcgTGlzdDw+KCk7CgkJLy8gICAgIGZvciAoQSB4IDogeHMpCgkJLy8gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5wbHVzKG5ldyBMaXN0PD4oeCkpOwoJCS8vICAgICB0aGlzID0gcmVzdWx0CgkJLy8gbGV0J3MgdGFrZSB0aGUgZXF1aXZhbGVudCBzaG9ydGN1dDoKCQkKCQlpZiAoeHMubGVuZ3RoID09IDApIHsKCQkJdGhpcy5oZWFkCT0gbnVsbDsKCQkJdGhpcy50YWlsCT0gbnVsbDsKCQkJdGhpcy5zaXplIAk9IDA7CgkJfQoJCWVsc2UgewoJCQlMaXN0PEE+IHJlc3VsdCA9IG5ldyBMaXN0PEE+KCk7CgkJCWZvciAoaW50IGkgPSB4cy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7CgkJCQlyZXN1bHQgPSBuZXcgTGlzdDxBPih4c1tpXSwgcmVzdWx0KTsKCQkJfQoJCQl0aGlzLmhlYWQJPSB4c1swXTsKCQkJdGhpcy50YWlsIAk9IHJlc3VsdDsKCQkJdGhpcy5zaXplCT0gcmVzdWx0LnNpemUgKyAxOwoJCX0KCX0KCQoJLy8gYW4gaW50ZXJuYWwgY29uc3RydWN0b3IgdG8gY3JlYXRlIHRoZSBsaW5rZWQgbGlzdHMKCXByaXZhdGUgTGlzdChBIHgsIExpc3Q8QT4geHMpIHsKCQl0aGlzLmhlYWQJPSB4OwoJCXRoaXMudGFpbAk9IHhzOwoJCXRoaXMuc2l6ZQk9IHhzLnNpemUgKyAxOwoJfQoJCgkvLyAiYmluZCIKCS8vICAgICBiaW5kIDo6IChNW0FdLCBBIOKGkiBNW0JdKSDihpIgTVtCXQoJLy8gY2FuIGJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIG91ciAicGx1cyIKCXB1YmxpYyA8Qj4gTGlzdDxCPiBiaW5kKEZ1bmN0aW9uPEEsIExpc3Q8Qj4+IGYpIHsKCQlpZiAodGhpcy5zaXplID09IDApIHJldHVybiBuZXcgTGlzdDxCPigpOwoJCUxpc3Q8Qj4gcGFydGlhbFJlc3VsdCA9IHRoaXMudGFpbC5iaW5kKGYpOwoJCXJldHVybiBmLmFwcGx5KHRoaXMuaGVhZCkucGx1cyhwYXJ0aWFsUmVzdWx0KTsKCX0KCQoJLy8gaG93IGFib3V0IGEgbmljZSAidG9TdHJpbmciPwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKCQlzYi5hcHBlbmQoIlsiKTsKCQlpZiAodGhpcy5zaXplID4gMCkgewoJCSAgIHNiLmFwcGVuZCh0aGlzLmhlYWQpOwoJCSAgIGZvciAoTGlzdDxBPiBwdHIgPSB0aGlzLnRhaWw7IHB0ci5zaXplID4gMDsgcHRyID0gcHRyLnRhaWwpIHsKCQkgICAgICAgc2IuYXBwZW5kKCIsIik7CgkJICAgICAgIHNiLmFwcGVuZChwdHIuaGVhZCk7CgkJICAgfQoJCX0KCQlzYi5hcHBlbmQoIl0iKTsKCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKCX0KfQoKcHVibGljIGNsYXNzIE1haW4gewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpCgl7CgkJLy8gZXhhbXBsZTogcmVwZWF0IGVhY2ggZWxlbWVudAoJICAgIGZpbmFsIEZ1bmN0aW9uPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXBlYXRFYWNoRWxlbWVudCA9IG5ldyBGdW5jdGlvbjxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKSB7CgkgICAgCUBPdmVycmlkZQoJICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGFwcGx5KFN0cmluZyBzKSB7CgkgICAgICAgICAgICByZXR1cm4gbmV3IExpc3Q8U3RyaW5nPihzLCBzKTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgZmluYWwgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgTGlzdDxTdHJpbmc+KCJmb28iLCAiYmFyIiwgImJheiIpOwoJICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHJpbmdzKTsKCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5ncy5iaW5kKHJlcGVhdEVhY2hFbGVtZW50KSk7CgkgICAgCgkgICAgLy8gZXhhbXBsZTogc3F1YXJlIGVhY2ggZWxlbWVudAoJICAgIGZpbmFsIEZ1bmN0aW9uPEludGVnZXIsIExpc3Q8SW50ZWdlcj4+IHNxdWFyZSA9IG5ldyBGdW5jdGlvbjxJbnRlZ2VyLCBMaXN0PEludGVnZXI+PigpIHsKCSAgICAJQE92ZXJyaWRlCgkgICAgICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGFwcGx5KEludGVnZXIgaSkgewoJICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PEludGVnZXI+KGkgKiBpKTsKCSAgICAgICAgfQoJICAgIH07CgkgICAgZmluYWwgTGlzdDxJbnRlZ2VyPiBudW1iZXJzID0gbmV3IExpc3Q8SW50ZWdlcj4oMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApOwoJICAgIFN5c3RlbS5vdXQucHJpbnRsbihudW1iZXJzKTsKCSAgICBTeXN0ZW0ub3V0LnByaW50bG4obnVtYmVycy5iaW5kKHNxdWFyZSkpOwoJICAgIAoJICAgIC8vIC0tLS0tLS0tLS0tLS0tLSAvLwoJICAgIC8vIFRoZSBNb25hZCBMYXdzOiAvLwoJICAgIC8vIC0tLS0tLS0tLS0tLS0tLSAvLwoJICAgIAoJICAgIC8vIG5vdGU6IHRoZXNlIGFyZW4ndCBfcHJvb2ZzXyBvZiBjb3JyZWN0bmVzLAoJICAgIC8vIGp1c3Qgc29tZSBleGFtcGxlcyBzaG93aW5nIHRoYXQgdGhleSdyZSBwcm9iYWJseSBjb3JyZWN0LgoJICAgIAoJICAgIC8vIDEuICIodW5pdCB4KSA+Pj0gZiDiiaEgIGYgeCIgLy8KCSAgICBhc3NlcnQgbmV3IExpc3Q8SW50ZWdlcj4oNDIpLmJpbmQoc3F1YXJlKS50b1N0cmluZygpID09IHNxdWFyZS5hcHBseSg0MikudG9TdHJpbmcoKTsKCSAgICAKCSAgICAvLyAyLiAibSA+Pj0gdW5pdCDiiaEgIG0iIC8vCgkgICAgZmluYWwgRnVuY3Rpb248SW50ZWdlciwgTGlzdDxJbnRlZ2VyPj4gdW5pdCA9IG5ldyBGdW5jdGlvbjxJbnRlZ2VyLCBMaXN0PEludGVnZXI+PigpIHsKCSAgICAJQE92ZXJyaWRlCgkgICAgCXB1YmxpYyBMaXN0PEludGVnZXI+IGFwcGx5KEludGVnZXIgaSkgewoJICAgIAkJcmV0dXJuIG5ldyBMaXN0PD4oaSk7CgkgICAgCX0KCSAgICB9OwoJICAgIGFzc2VydCBudW1iZXJzLmJpbmQodW5pdCkudG9TdHJpbmcoKSA9PSBudW1iZXJzLnRvU3RyaW5nKCk7CgkgICAgCgkgICAgLy8gMy4gIihtID4+PSBmKSA+Pj0gZyAgIOKJoSAgIG0gPj49ICggXHggLT4gKGYgeCA+Pj0gZykgKSIgLy8KCSAgICAvLyBtID0gbnVtYmVycwoJICAgIC8vIGYgPSBzcXVhcmUKCSAgICAvLyBnID0gc3RyaW5naWZ5CgkgICAgZmluYWwgRnVuY3Rpb248SW50ZWdlciwgTGlzdDxTdHJpbmc+PiBzdHJpbmdpZnkgPSBuZXcgRnVuY3Rpb248SW50ZWdlciwgTGlzdDxTdHJpbmc+PigpIHsKCSAgICAJQE92ZXJyaWRlCgkgICAgCXB1YmxpYyBMaXN0PFN0cmluZz4gYXBwbHkoSW50ZWdlciBpKSB7CgkgICAgCQlyZXR1cm4gbmV3IExpc3Q8PihpLnRvU3RyaW5nKCkpOwoJICAgIAl9CgkgICAgfTsKCSAgICBmaW5hbCBGdW5jdGlvbjxJbnRlZ2VyLCBMaXN0PFN0cmluZz4+IG5lc3RlZCA9IG5ldyBGdW5jdGlvbjxJbnRlZ2VyLCBMaXN0PFN0cmluZz4+KCkgewoJICAgIAlAT3ZlcnJpZGUKCSAgICAJcHVibGljIExpc3Q8U3RyaW5nPiBhcHBseShJbnRlZ2VyIGkpIHsKCSAgICAJCXJldHVybiBzcXVhcmUuYXBwbHkoaSkuYmluZChzdHJpbmdpZnkpOwoJICAgIAl9CgkgICAgfTsKCSAgICBhc3NlcnQgbnVtYmVycy5iaW5kKHNxdWFyZSkuYmluZChzdHJpbmdpZnkpLnRvU3RyaW5nKCkKCSAgICAJPT0gbnVtYmVycy5iaW5kKG5lc3RlZCkudG9TdHJpbmcoKTsKCX0KfQ==
[foo,bar,baz]
[foo,foo,bar,bar,baz,baz]
[1,2,3,4,5,6,7,8,9,10]
[1,4,9,16,25,36,49,64,81,100]