LINUX.ORG.RU

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

Исправление quasimoto, (текущая версия) :

в отличии от автоматического кастования в Sup

Ну в хаскеле скорее всего будет просто instance AdditiveGroup a => AdditiveGroup (Matrix a), то есть (^+^) :: AdditiveGroup a => Matrix a -> Matrix a -> Matrix a, как и у (+) в Num — они общеприняты мономорфными, так как нет subtype polymorphism — «аналог» не нужен.

В C++ есть ООП, то есть subtype polymorphism для примитивных типов, классов и указателей с ссылками, но с parametricity он не заводится — нет ковариантности, то есть C[+T], T <: U | C[T] <: C[U]; T' <: T, U <: U' | T -> U <: T' < U' и т.п. Поэтому приходится делать разные манипуляции в типах у шаблонов (которые отвечают за parametricity в плюсах).

А где-то в Scala есть ковариантность, поэтому там такие манипуляции не нужны. Только ценой того, что, например, «массив структур» не может упаковать в память сами структуры — только ссылки на них (поэтому же std::vector<B>, при B <: A не сможет чудесным образом подняться в std::vector<A>, так как расположение в памяти другое).

Исходная версия quasimoto, :

в отличии от автоматического кастования в Sup

Ну в хаскеле скорее всего будет просто instance AdditiveGroup a => AdditiveGroup (Matrix a), то есть (^+^) :: AdditiveGroup a => Matrix a -> Matrix a -> Matrix a, как и у (+) в Num — они общеприняты мономорфными, так как нет subtype polymorphism — «аналог» не нужен.

В C++ есть ООП, то есть subtype polymorphism для примитивных типов, классов и указателей с ссылками, но с parametricity он не заводится — нет ковариантности, то есть C[+T], T <: U | C[T] <: C; T' <: T, U <: U' | T -> U <: T' < U' и т.п. Поэтому приходится делать разные манипуляции в типах у шаблонов (которые отвечают за parametricity в плюсах).

А где-то в Scala есть ковариантность, поэтому там такие манипуляции не нужны. Только ценой того, что, например, «массив структур» не может упаковать в память сами структуры — только ссылки на них (поэтому же std::vector<B>, при B <: A не сможет чудесным образом подняться в std::vector<A>, так как расположение в памяти другое).