55

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

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

编辑 :

从托尼莫里斯的这个演讲中:

高阶多态性:

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

2 回答 2

79

模板-模板参数?

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);
    }
};
于 2010-04-02T05:48:41.770 回答
3

通常一个普通的模板不是已经是一种高级类型了吗?例如std::vector,需要一个类型参数来创建一个实际的类型 like std::vector<int>,所以它有 kind * -> *

于 2010-04-02T05:41:56.760 回答