История изменений
Исправление quasimoto, (текущая версия) :
то есть это 4 разных вещи
Ну да
// 1
template <typename A> A id(A x) { return x; }
// 2
template <typename T> class List;
// 3
template <typename A> A op(A a, A b);
template <> int op(int a, int b) { ... }
// template <> int op(int a, double b) { ... } wrong
// ...
// 4
template <typename A>
struct Monoid {
A e();
A op(A a, A b);
};
template<>
struct Monoid<int> {
static int e() { ... }
static int op(int x, int y) { ... }
};
// forall a. Monoid a => a -> a -> a -> a
template <typename A>
A op3(A a, A b, A c)
{
typedef Monoid<A> M;
return M::op(a, M::op(b, c));
}
В последнем не хватает только ограниченной квантификации Monoid-ом в сигнатуре op3 (и тут появляется концепт концептов).
Ограниченная квантификация с ad-hoc полиморфизмом никак не связана, это ортогональные вещи.
http://people.csail.mit.edu/dnj/teaching/6898/papers/wadler88.pdf
Речь шла про ограниченную квантификацию которую дают концепты и классы типов.
В классической полиморфной типизированной лямбде с подтипированием ad-hoc полиморфизма и нетути, кстати.
Э, ну да. Но речь сначала шла про общий полиморфизм (в этой самой лямбде, тоже), потом про ограничения (уже нет) — ad-hoc-ом обозвалось только потому что в хаскеле его (ad-hoc) через ограничения классов типов делают (Bounded a => a — функция перегруженная по реализациям интерфейса Bounded).
Исходная версия quasimoto, :
то есть это 4 разных вещи
Ну да
// 1
template <typename A> A id(A x) { return x; }
// 2
template <typename T> class List;
// 3
template <typename A> A op(A a, A b);
template <> int op(int a, int b) { ... }
// template <> int op(int a, double b) { ... } wrong
// ...
// 4
template <typename A>
struct Monoid {
A e();
A op(A a, A b);
};
template<>
struct Monoid<int> {
static int e() { ... }
static int op(int x, int y) { ... }
};
// forall a. Monoid a => a -> a -> a -> a
template <typename A>
A op3(A a, A b, A c)
{
typedef Monoid<A> M;
return M::op(a, M::op(b, c));
}
В последнем не хватает только ограниченной квантификации Monoid-ом в сигнатуре op3 (и тут появляется концепт концептов).
Ограниченная квантификация с ad-hoc полиморфизмом никак не связана, это ортогональные вещи.
http://people.csail.mit.edu/dnj/teaching/6898/papers/wadler88.pdf
Речь шла про ограниченную квантификацию которую дают концепты и классы типов.
В классической полиморфной типизированной лямбде с подтипированием ad-hoc полиморфизма и нетути, кстати.
Э, ну да. Ad-hoc-ом обозвалось только потому что в хаскеле его через ограничения классов типов делают (Bounded a => a — функция перегруженная по реализациям интерфейса Bounded).