Tipos de tipo superior con C ++

Esta pregunta es para las personas que conocen tanto Haskell (o cualquier otro lenguaje funcional que admita tipos de tipo superior) como C ++ ...

¿Es posible modelar tipos superiores con plantillas C ++? ¿Si es así, entonces cómo?

EDITAR:

Deesta presentación de Tony Morris:

Polimorfismo de orden superior:

Lenguajes como Java y C # tienen polimorfismo de primer orden porque nos permiten abstraer en tipos. p.ej.List<A> puede tener unreverse función que funciona en cualquier tipo de elemento (elA)

Los lenguajes de programación más prácticos y los sistemas de tipos nos permiten también abstraernos en constructores de tipos.

Esta característica se llama polimorfismo de orden superior (o de tipo superior).

Ejemplo:

Pseudo-Java con una notación inventada para polimorfismo de orden superior

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);
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta