2010-04-02 7 views
36

Diese Frage ist für die Menschen, die sowohl Haskell kennen (oder eine beliebige andere funktionale Sprache, die Höher kinded Typen unterstützt) und C++ ...Higher-kinded Typen mit C++

Ist es möglich, zu modellieren höher kinded Typen mit C++ Vorlagen? Wenn ja, wie?

EDIT:

Von this Präsentation von Tony Morris:

Höherwertige Polymorphism:

  • Sprachen wie Java und C# erster Ordnung Polymorphismus weil sie erlauben uns, auf Typen zu abstrahieren. z.B. List<A> kann eine reverse Funktion haben, die auf jedem Elementtyp funktioniert ( A).

  • Praktischere Programmiersprachen und Typ-Systeme ermöglichen es uns, abstrakt auf Typkonstruktoren als gut.

  • Diese Funktion wird als höherer Ordnung (oder höherer Ordnung) Polymorphismus höherer Ordnung bezeichnet.

Beispiel:

Pseudo-Java mit einer erfundenen Notation für höhere Ordnung Polymorphismus

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

Vielleicht könnten Sie ein Beispiel für Ihr Ziel geben. Für uns nicht-wissen-funktionale-Idiome-sehr gut Typen, die helfen würden. – GManNickG

+1

@GMan: Ich könnte ein Beispiel geben, aber ich bin mir bewusst, dass es kaum etwas bedeuten wird außer für die Leute, die es schon wissen. Also habe ich mir kein Beispiel genommen. –

+1

@Venkat: Ich meine ein Ziel, was ist dein größeres Bild? Sie möchten einen höheren Typ für: __________. Auch ein sehr einfaches Beispiel mit Kommentaren wäre immer noch besser als nichts. :) – GManNickG

Antwort

52

Template-Template-Parameter?

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

So können Template-Parameter selbst Vorlagen sein? Groß!Das wusste ich nicht! Danke für die Antwort! :) –

+11

ich mit anderen Worten: das Vorlagensystem in C++ ist (versehentlich) Turing Abgeschlossen ist es ziemlich unglaublich, was Sie damit machen können :) –

+1

Was ist der höchste Rang der höheren Ordnung Typen, die mit diesem tho konstruiert werden können? ist 'Vorlage >> erlaubt? –

2

ist nicht in der Regel eine normale Vorlage bereits ein höherer kinded Typ? Zum Beispiel std::vector nimmt einen Typparameter, um einen tatsächlichen Typ wie std::vector<int> zu erstellen, so hat es Art * -> *.

+6

Die Frage ist wirklich über Polymorphismus gegenüber höher-kinded Typen, dh * Variablen * mit höheren Arten . –

+2

Höher als '* -> *' –

+0

@Ganesh: Ja, jetzt ist es. Zu Beginn wurde nur gefragt, ob es Arten höherer Arten gäbe, also erwähnte ich Vorlagen nicht als Template-Parameter, um die Dinge nicht unnötig zu komplizieren. – sth