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