用C ++更高级的types
这个问题是为了解Haskell(或任何其他支持Higher-kindedtypes的函数式语言)和C ++的人
是否有可能使用C ++模板来build模更高级别的types? 如果是,那么如何?
编辑:
从托尼·莫里斯的演讲:
高阶多态性:
-
像Java和C#这样的语言具有一阶多态性,因为它们允许我们抽象types。 例如
List<A>
可以有一个reverse
function,适用于任何元素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,所以它有* -> *
。