2010-04-02 22 views
36

Esta pregunta es para las personas que conocen tanto Haskell (o cualquier otro lenguaje funcional que soporta Tipos de mayor kinded) y C++ ...Tipos de mayor kinded con C++

Es posible modelar tipos más altos kinded usando C++ plantillas? ¿Si es así, entonces cómo?

EDIT:

De this presentación por Tony Morris:

de orden superior Polimorfismo:

  • lenguajes como Java y C# tienen polimorfismo de primer orden, porque ellos nos permiten abstraer en tipos. p.ej. List<A> puede tener una función reverse que funciona en cualquier tipo de elemento ( A).

  • lenguajes de programación más prácticas y sistemas de tipo nos permiten abstracto en constructores de tipos como también.

  • Esta característica se llama polimorfismo de orden superior (o de mayor peso).

Ejemplo:

Pseudo-Java con una notación inventado para el polimorfismo de orden superior

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

Tal vez usted podría dar un ejemplo de su objetivo. Para nosotros, no conocemos los tipos de lenguaje funcional, tipos muy buenos que podrían ayudarnos. – GManNickG

+1

@GMan: Podría dar un ejemplo, pero soy consciente de que apenas significará nada, excepto para las personas que ya lo conocen. Así que no me molesté en incluir un ejemplo. –

+1

@Venkat: me refiero a un objetivo, ¿cuál es tu panorama general? Desea un tipo de mayor nivel para: __________. Además, un ejemplo muy simple con comentarios sería mejor que nada. :) – GManNickG

Respuesta

52

¿Parámetros de la plantilla de plantilla?

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

¿Los parámetros de la plantilla pueden ser plantillas en sí mismas? ¡Estupendo!¡No lo sabía! ¡Gracias por la respuesta! :) –

+11

I otras palabras: el sistema de plantilla en C++ es (accidentalmente) Turing Complete es bastante increíble lo que puedes hacer con él :) –

+1

¿cuál es el rango más alto de tipos de orden superior que se pueden construir con este tho? es 'template