Cette question s’adresse aux personnes qui connaissent à la fois Haskell (ou tout autre langage fonctionnel prenant en charge les types supérieurs) et C ++ …
Est-il possible de modéliser des types similaires à l’aide de modèles C ++? Si oui, alors comment?
MODIFIER :
De cette présentation de Tony Morris:
Polymorphisme d’ordre supérieur:
Des langages tels que Java et C # ont un polymorphism de premier ordre car ils nous permettent d’abstraire les types. Par exemple, List
peut avoir une fonction reverse
qui fonctionne sur n’importe quel type d’élément (le A
).
Des langages de programmation et des systèmes de types plus pratiques nous permettent également de décrire des constructeurs de types.
Cette fonctionnalité est appelée polymorphism d’ordre supérieur (ou supérieur).
Exemple :
Pseudo-Java avec une notation inventée pour le polymorphism d’ordre supérieur
interface Transformer { Y transform(X x); } interface Monad { // M :: * -> * M pure(A a); M bind(Transformer<A, M> t, M a); }
Paramètres du template-template?
template class m> struct Monad { template static m mreturn(const a&); template static m mbind(const m&, m(*)(const a&)); }; template struct Maybe { bool isNothing; a value; }; template <> struct Monad { template static Maybe mreturn(const a& v) { Maybe x; x.isNothing = false; x.value = v; return x; } template static Maybe mbind(const Maybe& action, Maybe(*function)(const a&)) { if (action.isNothing) return action; else return function(action.value); } };
N’est-ce pas généralement un modèle normal un type plus élevé? Par exemple, std::vector
prend un paramètre de type pour créer un type réel tel que std::vector
, il a donc un type * -> *
.