【问题标题】:Higher-kinded Types with C++使用 C++ 的高级类型
【发布时间】:2025-12-05 14:20:04
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 也许你可以举个例子来说明你的目标。对于我们不知道功能性习语-非常好的类型会有所帮助。
  • @GMan:我可以举个例子,但我很清楚,除了已经知道它的人之外,它几乎没有任何意义。所以我没有费心举个例子。
  • @Venkat:我的意思是一个目标,你的大局是什么?你想要一个更高级的类型:__________。此外,一个非常简单的 cmets 示例仍然比没有好。 :)
  • 我认为总体目标仍然对每个人都非常有帮助。
  • @Venkat:非常感谢。现在我明白了……哦,等等,已经回答了。 :)

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


【解决方案1】:

通常一个普通的模板不是已经是一个高级类型了吗?例如std::vector 接受一个类型参数来创建一个像std::vector&lt;int&gt; 这样的实际类型,所以它有一种* -&gt; *

【讨论】:

  • 问题实际上是关于更高种类的多态性,即具有更高种类的变量
  • @Ganesh:是的,现在是。一开始它只是询问是否有更高种类的类型,所以我没有提到模板作为模板参数,以免使事情复杂化。
【解决方案2】:

模板-模板参数?

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

【讨论】:

  • 那么模板参数可以是模板本身吗?伟大的!我不知道!感谢您的回答! :)
  • 换句话说:C++ 中的模板系统(意外地)是图灵完备的,你可以用它做什么真是令人难以置信:)
  • 可以用这个 tho 构建的*别的高阶类型是什么? template &lt;template &lt;template ...&gt; &gt; &gt; 是否允许?
  • @ErikAllik 没有自然限制。你可以做template &lt;template &lt;template &lt;template &lt;...&gt; class&gt; class&gt; class m&gt;
  • 我更感兴趣的是如何使用这种更高层次的结构......我可以让你添加一个使用mbindMaybe 和@987654326 结合使用的示例@?