c++ templates haskell higher-kinded-types

Tipos de mayor calidad con C++



templates haskell (2)

¿Normalmente no es una plantilla normal ya un tipo de mayor nivel? Por ejemplo std::vector toma un parámetro de tipo para crear un tipo real como std::vector<int> , por lo que tiene kind * -> * .

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

¿Es posible modelar tipos de kinded más altos usando plantillas de C ++? ¿Si es así, entonces cómo?

EDITAR:

De this presentación de Tony Morris:

Polimorfismo de orden superior:

  • Los lenguajes como Java y C # tienen polimorfismo de primer orden porque nos permiten abstraer en tipos. por ejemplo, List<A> puede tener una función reverse que funcione en cualquier tipo de elemento ( A ).

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

  • Esta característica se llama polimorfismo de orden superior (o de mayor nivel).

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


Parámetros de plantilla-plantilla?

template <template <typename> class m> struct Monad { template <typename a> static m<a> mreturn(const a&); template <typename a, typename b> static m<b> mbind(const m<a>&, m<b>(*)(const a&)); }; template <typename a> struct Maybe { bool isNothing; a value; }; template <> struct Monad<Maybe> { template <typename a> static Maybe<a> mreturn(const a& v) { Maybe<a> x; x.isNothing = false; x.value = v; return x; } template <typename a, typename b> static Maybe<b> mbind(const Maybe<a>& action, Maybe<b>(*function)(const a&)) { if (action.isNothing) return action; else return function(action.value); } };