interface Transformer { Y transform(X x); } interface Monad { // M :: * -> * M pure(A a); M bind(Transformer> t, M a); }
43
30
この質問は、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
vector`はtypeパラメーターを取り、` std :: vector`のような実際の型を作成するため、種類は `*→ *`です。