Типы высшего рода в C++
-
23-09-2019 - |
Вопрос
Этот вопрос предназначен для людей, которые знают как Haskell (или любой другой функциональный язык, поддерживающий типы высшего порядка), так и C++...
Можно ли моделировать типы более высокого рода с помощью шаблонов C++?Если да, то как?
РЕДАКТИРОВАТЬ :
От этот презентация Тони Морриса:
Полиморфизм высшего порядка:
Такие языки, как 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);
}
};
Другие советы
Разве обычно обычный шаблон уже не является типом более высокого типа?Например std::vector
принимает параметр типа для создания фактического типа, например std::vector<int>
, так что это имеет вид * -> *
.