Я не думаю, что существующие ответы уместны.В Scala есть много удобств, но они не связаны с мощной системой типов только потому, что они относятся к типам.Фактически, вывод типа находится в прямом противоречии с мощью системы типов - если бы она была менее мощной, можно было бы сделать вывод полного типа (как в Haskell).
Итак,
- У Scala есть классы с участниками.(Очевидно, но я пытаюсь быть здесь исчерпывающим.)
- Члены метода ("def") класса scala могут иметь ноль или более списков параметров, каждый из которых может иметь ноль или более параметров,последний из которых может быть переменным.
- Параметры могут передаваться по значению или по имени.
- Параметры имеют имена и могут иметь значения по умолчанию.
- Scala имеет "var"и члены "val" (которые на практике также являются методами).
- В Scala есть члены "lazy val".
- В Scala есть члены "типа" (псевдонимы типов), которые могут бытьуказывается как фиксированные типы или как границы типов.
- Scala имеет абстрактные классы и члены (все вышеперечисленные члены могут быть абстрактными).
- Scala имеет внутренний класс, черты и объекты (внутренний класс Scalaотличаются от Java).
- Элементы Scala, а также внутреннее содержимое могут быть переопределены.
- Scala имеет наследование типов.
- Scala имеет признаки, обеспечивающие множественное наследование с типомлинеаризация.
- Трасса Скалычлены его метода могут иметь абстрактное переопределение (наращиваемое, переопределенное по аспекту).
- Scala имеет одноэлементные типы.
- Scala имеет сопутствующий класс / объекты (связанные с областью действия).
- Scala имеет частные, защищенные и общедоступные области видимости для классов, признаков, синглетонов и членов.
- Частные и защищенные области Scala могут быть ограничены любым вмещающим пакетом, классом, признаком или синглтоном, плюс «this».
- Scala имеет собственные типы.
- Scala имеет параметры типа.
- Параметры типа Scala могут быть как взаимными, так и противоположными, а также инвариантными.
- Scalaимеет конструкторы типов.
- Scala имеет типы высшего порядка.
- Scala имеет экзистенциальные типы.
- Scala имеет структурные типы.
- Scala имеет неявные параметры.
- В Scala есть типы функций, так как они просто класс плюс синтаксический сахар, я не думаю, что он входит в этот список.С другой стороны, типы функций являются частью границ представления, так что, возможно, это так.
- У Scala есть верх (как почти у всех) и низ (как у других статически типизированных языков fp).
- «Единица» Scala - это тип со значением (в отличие от «void» в других местах).
Далее, есть функции, связанные с причастностями Scala, что и заслуживает их включения выше.
- Scala имеет границы просмотра, неявный параметр, который действует как граница другого типа.
- Scala имеет контекстные купоны, неявный параметр, который действует как другая граница.
- Вообще говорянеявные параметры и вывод типа могут быть объединены для построения произвольных комплексных доказательств над параметрами типа.
Относительно последнего комментария, следствия и вывод типа вместе делают систему типов Scala проверкой завершения.То есть вы кодифицируете произвольные программы как типы, которые будут «запускаться» во время компиляции компилятором.Доказательство здесь , с помощью SKI Calculus, с «глючным» бесконечным циклом в типах в качестве дополнительной демонстрации.
Список функций, приведенный выше, довольно большой и впечатляющий во многих отношениях.Однако именно способ, которым Scala комбинирует импликации и вывод типов для создания статических доказательств во время компиляции (таких как границы представления и границы контекста), делает систему типов Scala уникальной.AFAIK, другого языка для этого нет, хотя, безусловно, есть и другие языки, обеспечивающие возможность проверки другими способами.