First let's pretend that Java/C# are practical

Example 2. Pseudo-Java with an invented notation for higher-order polymorphism[4]

interface Transformer<X, Y> {
  Y transform(X x);
}

interface Monad<M> { // M :: * -> *
  <A> M<A> pure(A a);
  <A, B> M<B> bind(Transformer<A, M<B>> t, M<A> a);
}



[4] or C# with a slight syntax change