c++ - 使用 C++ 的高级类型

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

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

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

编辑:

来自 this Tony Morris 的演讲:

高阶多态性:

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

最佳答案

模板-模板参数?

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++ - 使用 C++ 的高级类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2565097/

相关文章:

templates - 模块出现在新的 DotNetNuke 页面中,但未在任何模板文件中指定

function - 在 Maybe 类型上应用函数?

haskell - 是否可以组合类型类的实例?

c++ - std::cout不显示任何内容,也不显示std::cin要求输入

c++ - 如何在 C++ 中使用冒泡排序对列表进行排序

c++ - 预测可能的匹配以避免使用 Levenshtein 算法

c++ - 定义常量数据成员

templates - 如何在 CouchDB 中使用 html 模板

c++ - 如何使用 C++ 中的模板从 json 中填充尽可能通用的 std::vector (11)?

list - Haskell 函数将列表中的元素相乘