Ven*_*iva 45 c++ templates haskell higher-kinded-types
这个问题适用于了解Haskell(或任何其他支持高级类型的函数语言)和C++的人...
是否可以使用C++模板对更高级的kinded类型进行建模?如果是,那怎么样?
编辑:
从该演示文稿由托尼·莫里斯:
高阶多态性:
Java和C#等语言具有一阶多态性,因为它们允许我们对类型进行抽象.例如,
List<A>可以有一个reverse适用于任何元素类型(A)的函数
.
更实用的编程语言和类型系统允许我们在类型构造函数上进行抽象.
此功能称为高阶(或更高阶)多态.
示例:
伪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);
}
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 63
模板模板参数?
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);
}
};
Run Code Online (Sandbox Code Playgroud)