2010-04-02 13 views
36

Questa domanda è per le persone che conoscono sia Haskell (o qualsiasi altro linguaggio funzionale che supporta i tipi più elevati-kinded) e C++ ...tipi superiori-kinded con C++

E 'possibile modellare i tipi più elevato kinded utilizzando Modelli C++? Se sì, allora come?

EDIT:

Da this presentazione di Tony Morris:

di ordine superiore polimorfismo:

  • linguaggi come Java e C# hanno primo ordine polimorfismo perché loro ci permettono di astrarre su tipi. per esempio. List<A> può avere una funzione reverse che funziona su qualsiasi tipo di elemento ( A).

  • più pratici dei linguaggi di programmazione e dei sistemi di tipo ci permettono di astratto su costruttori di tipo come bene.

  • Questa funzione è denominata polimorfismo di ordine superiore (o di tipo superiore).

Esempio:

Pseudo-Java con una notazione inventata per ordine superiore polimorfismo

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

Forse potresti dare un esempio del tuo obiettivo. Per noi non-so-funzionali-idiomi-tipi molto bene che aiuterebbero. – GManNickG

+1

@GMan: Potrei dare un esempio, ma sono ben consapevole che non significherà nulla tranne per le persone che lo conoscono già. Quindi non mi sono preoccupato di includere un esempio. –

+1

@Venkat: intendo un obiettivo, qual è la tua immagine più grande? Vuoi un tipo più alto per: __________. Inoltre, un esempio molto semplice con commenti sarebbe ancora meglio di niente. :) – GManNickG

risposta

52

Parametri modello modello?

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

Quindi i parametri del modello possono essere i modelli stessi? Grande!Non lo sapevo! Grazie per la risposta! :) –

+11

Ho altre parole: il sistema di template in C++ essendo (accidentalmente) Turing Completo è abbastanza incredibile quello che puoi fare con esso :) –

+1

qual è il più alto rango di tipi di ordine superiore che possono essere costruiti con questo? è 'template