Типовые классы кажутся отличной возможностью писать общие и многоразовые функции очень последовательным, эффективным и расширяемым способом. Но до сих пор им не предоставляется "основной язык". Напротив: Concepts, которые являются довольно аналоговой идеей, были исключены из следующий С++!
Какое рассуждение против типов? По-видимому, многие языки ищут способ решения аналогичных проблем:.NET представил общие ограничения и интерфейсы, такие как IComparable
, которые позволяют такие функции, как
T Max<T>(T a, T b) where T : IComparable<T> { // }
для работы со всеми типами, реализующими интерфейс.
Scala вместо этого использует комбинацию признаков и так называемых неявных параметров/границ обзора, которые автоматически передаются в общие функции.
Но обе концепции, показанные здесь, имеют большие недостатки. Интерфейсы основаны на наследовании и, следовательно, относительно медленны из-за косвенности и, кроме того, нет возможности разрешить существующий тип реализовать их.
Если бы нам понадобилась абстракция для моноида, мы могли бы неплохо написать интерфейс и позволить нашим типам реализовать это, но встроенные типы, такие как int
, никогда не могли работать с вашими функциями изначально.
Неявные параметры вместо этого несовместимы с обычными интерфейсами/чертами.
С типами классов не было бы проблемы (псевдокода)
typeclass Monoid of A where
static operator (+) (x : A, y : A) : A
static val Zero : A
end
instance Int of Monoid where
static operator (+) (x : Int, y : Int) : Int = x + y
static val Zero : Int = 0
end
Так почему бы нам не использовать классы типов? Есть ли у них серьезные недостатки?
Изменить. Пожалуйста, не путайте стили со структурной типизацией, чистые шаблоны С++ или утиную печать. Класс типов явно создается экземплярами типов, а не удовлетворен только конвенцией. Более того, он может нести полезные реализации, а не просто определять интерфейс.