这个问题是针对那些熟悉Haskell (或任何其他支持高级类型的函数语言)和C++的人.
是否可以使用C++模板来建模更高类型的类型?如果是,那怎么做?
编辑:
来自托尼·莫里斯的这演示文稿:
高阶多态性:
List<A>可以有一个在任何元素类型( A)上工作的reverse函数。示例:
伪Java和一种高级多态表示法
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);
}发布于 2010-04-02 05:48:41
模板-模板参数?
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 Maybe<b>{true, b{}};
else
return function(action.value);
}
};发布于 2010-04-02 05:41:56
通常情况下,一个普通的模板不是已经是一种高级类型了吗?例如,std::vector接受一个类型参数来创建一个实际的类型,比如std::vector<int>,所以它有类型的* -> *。
https://stackoverflow.com/questions/2565097
复制相似问题