43


30

C ++を使用したより種類の高い型

この質問は、Haskell(または高次型をサポートする他の関数型言語)とC ++の両方を知っている人向けです…​

C ++テンプレートを使用して、より高い種類のモデルを作成することはできますか? もしそうなら、どうやって?

編集:

トニー・モリスによるhttp://www.blumenfeld-maso.com/2010/01/what-does-monad-mean-by-tony-morris/[this]プレゼンテーションから:

高次ポリモーフィズム:

  • JavaやC#などの言語には、1次多型があります。 型を抽象化できます。 e.g. List`は、あらゆる要素タイプ( A`)で機能する `reverse`関数を持つことができます。

  • より実用的なプログラミング言語と型システムにより、 型コンストラクタの抽象化も同様です。

  • この機能は、高次(または高種類)ポリモーフィズムと呼ばれます。

例:

高次ポリモーフィズム用に発明された表記法を使用した擬似Java

interface Transformer {
  Y transform(X x);
}

interface Monad { // M :: * -> *
   M pure(A a);
   M bind(Transformer> t, M a);
}

2 Answer


61


テンプレート-テンプレートパラメータ?

template  class m>
struct Monad {
    template
    static m mreturn(const a&);

    template
    static m mbind(const m&, m(*)(const a&));
};

template
struct Maybe {
    bool isNothing;
    a value;
};

template <>
struct Monad {
    template
    static Maybe mreturn(const a& v) {
        Maybe x;
        x.isNothing = false;
        x.value = v;
        return x;
    }

    template
    static Maybe mbind(const Maybe& action, Maybe(*function)(const a&)) {
        if (action.isNothing)
            return action;
        else
            return function(action.value);
    }
};


3


通常、通常のテンプレートは、すでにより高い種類のテンプレートではありませんか? たとえば、 `std

vector`はtypeパラメーターを取り、` std :: vector`のような実際の型を作成するため、種類は `*→ *`です。