使用C ++的高级类型

时间:2010-04-02 05:12:58

标签: c++ templates haskell higher-kinded-types

这个问题适用于了解Haskell(或支持高级类型的任何其他功能语言)和C ++的人......

是否可以使用C ++模板对更高级的kinded类型进行建模?如果是,那怎么办?

编辑:

来自Tony Morris的this演讲:

高阶多态性

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

2 个答案:

答案 0 :(得分:62)

模板模板参数?

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

答案 1 :(得分:3)

通常不是普通模板已经是更高级的类型?例如,std::vector采用类型参数来创建类似std::vector<int>的实际类型,因此它具有* -> *种类。