2010-04-02 12 views
36

To pytanie jest dla ludzi, którzy znają zarówno Haskell (lub innego języka funkcjonalnego, który obsługuje wyższej kinded typy) i C++ ...Wyższe-kinded Typy z C++

Czy można modelować wyższe kinded rodzajów korzystania Szablony C++? Jeśli tak, to w jaki sposób?

EDIT:

Od this prezentacji Tony Morris:

wyższego rzędu polimorfizmu:

  • w językach takich jak Java i C# mają pierwszego rzędu polimorfizm ponieważ oni pozwalają nam na streszczenie na typy. na przykład List<A> może mieć funkcję reverse , która działa na dowolnym typie elementu ( A).

  • bardziej praktycznych języków programowania i systemy typu pozwalają nam streszczenie na konstruktorów typu jak dobrze.

  • Ta funkcja nazywa się polimorfizmem wyższego rzędu (lub wyższym).

Przykład:

Pseudo-Java z wymyśloną notacji dla wyższego rzędu polimorfizmu

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

Może mógłbyś podać przykład swojego celu. Dla nas nie znamy-funkcjonalnych-idiomów-bardzo dobrze typów, które mogłyby pomóc. – GManNickG

+1

@GMan: Mogę podać przykład, ale mam świadomość, że nie będzie to miało większego znaczenia niż ludzie, którzy już to wiedzą. Więc nie zawracałem sobie głowy dołączeniem przykładu. –

+1

@Venkat: Mam na myśli cel, jaki jest twój większy obraz? Chcesz typu o wyższym typie dla: __________. Również bardzo prosty przykład z komentarzami byłby lepszy niż nic. :) – GManNickG

Odpowiedz

52

Parametry szablonu 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); 
    } 
}; 
+2

Więc parametry szablonu mogą być szablonami? Wspaniały!Nie wiedziałem tego! Dziękuję za odpowiedź! :) –

+11

Innymi słowy: system szablonów w C++ jest (przypadkowo) Turing Complete jest dość niewiarygodny co można z nim zrobić :) –

+1

jaka jest najwyższa ranga typów wyższego rzędu, które można zbudować za pomocą tego tho? jest "szablon >>" dozwolone? –

2

zwykle nie jest normalny szablon już wyższej kinded typ? Na przykład std::vector przyjmuje parametr typu, aby utworzyć rzeczywisty typ, taki jak std::vector<int>, więc ma on rodzaj * -> *.

+6

Pytanie dotyczy tak naprawdę polimorfizmu nad typami wyższego rzędu, tj. Mającymi * zmienne * z wyższymi rodzajami . –

+2

Wyższe niż '* -> *' :) –

+0

@Ganesh: Tak, już jest. Na początku zapytano tylko, czy istnieją typy wyższych typów, więc nie wspomniałem o szablonach jako parametrach szablonu, aby nie komplikować koniecznie rzeczy. – sth