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);
}
Author: Venkat Shiva, 2010-04-02

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);
    }
};
 57
Author: kennytm,
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 * -> *.

 3
Author: sth,
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