LINUX.ORG.RU

История изменений

Исправление 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).