首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有C++的高级类型

带有C++的高级类型
EN

Stack Overflow用户
提问于 2010-04-02 05:12:58
回答 2查看 10.8K关注 0票数 59

这个问题是针对那些熟悉Haskell (或任何其他支持高级类型的函数语言)和C++的人.

是否可以使用C++模板来建模更高类型的类型?如果是,那怎么做?

编辑:

来自托尼·莫里斯的演示文稿:

高阶多态性:

  • 像Java和C#这样的语言具有一级多态,因为它们允许我们抽象类型。例如,List<A>可以有一个在任何元素类型( A)上工作的reverse函数。
  • 更实用的编程语言和类型系统也允许我们抽象类型构造函数。
  • 这个特性被称为高阶(或高级)多态.

示例:

伪Java和一种高级多态表示法

代码语言:javascript
运行
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-02 05:48:41

模板-模板参数?

代码语言:javascript
运行
复制
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 Maybe<b>{true, b{}};
        else
            return function(action.value);
    }
};
票数 84
EN

Stack Overflow用户

发布于 2010-04-02 05:41:56

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2565097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档