用C ++更高级的types

这个问题是为了解Haskell(或任何其他支持Higher-kindedtypes的函数式语言)和C ++的人

是否有可能使用C ++模板来build模更高级别的types? 如果是,那么如何?

编辑:

从托尼·莫里斯的演讲:

高阶多态性:

  • 像Java和C#这样的语言具有一阶多态性,因为它们允许我们抽象types。 例如List<A>可以有一个reversefunction,适用于任何元素types( A )。

  • 更实用的编程语言和types系统也允许我们抽象types构造函数。

  • 这个特征被称为高阶(或更高阶)多态。

例如:

伪高级多态性的发明符号

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

模板 – 模板参数?

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

通常不是一个正常的模板已经是一个更高的types? 例如, std::vector需要一个types参数来创build一个类似于std::vector<int>的实际types,所以它有* -> *