使用C++的高级类型

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)

  • 换句话说:C++中的模板系统正在(意外)图灵完成它你用它做什么真是太不可思议了:) (13认同)
  • 我更感兴趣的是,如何使用这个更高级的结构...我可以让你添加一个使用`mbind`和`Maybe`和`Monad <Maybe>`的例子吗? (4认同)
  • 那么模板参数可以自己模板吗?大!我不知道!谢谢你的回答!:) (2认同)