Monads and more monads

In fact, there are lots of possible instances of the Monad interface. Even Transformer with one type variable applied is a monad.

Example 4. The Transformer<X, _> monad

new Monad<Transformer<X, _>>() {
  public <A> Transformer<X, A> pure(A a) {
    return new Transformer<X, A>() {
      public A transform(X x) { return a; }
    };
  }

  public <A, B> Transformer<X, B> bind(
        Transformer<A, Transformer<X, B>> t, Transformer<X, A> a) {
    return new Transformer<X, B>() {
      public B transform(X x) { return
        t.transform(a.transform(x)).transform(x); }
    };
  }
};