Typy wyższe z C++
To pytanie jest dla ludzi, którzy znają zarówno Haskell (lub jakikolwiek inny język funkcjonalny, który obsługuje typy o wyższym stopniu pokrewieństwa), jak i C++...
Czy możliwe jest modelowanie wyższych typów przy użyciu szablonów C++? Jeśli tak, to jak?
EDIT:
From this presentation by Tony Morris:
Polimorfizm wyższego rzędu:
Języki takie jak Java i C# mają polimorfizm pierwszego rzędu, ponieważ pozwól nam streścić na typy. np.
List<A>
może miećreverse
funkcję który działa na dowolnym typie elementu (A
).Bardziej praktyczne języki programowania i systemy typu pozwalają nam na streszczenie o konstruktorach typu jako cóż.
Ta funkcja nazywa się wyższego rzędu polimorfizm (lub wyższy).
Przykład:
Pseudo-Java z wymyśloną notacją dla polimorfizmu wyższego rzędu
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);
}
2 answers
Template-parametry szablonu?
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);
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-02 05:48:41
Czy Zwykle zwykły szablon nie jest już typem o wyższym pokrewieństwie? Na przykład std::vector
pobiera parametr type, aby utworzyć rzeczywisty typ, taki jak std::vector<int>
, więc ma typ * -> *
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-02 05:48:39