Что такое «мощная» система типов в Scala? - PullRequest
30 голосов
/ 15 сентября 2011

Когда обсуждается Scala, система типов всегда упоминается как одна из основных функций. Это называется мощной и основной причиной языкового прозвища (Scala - сокращение от «масштабируемый язык»). Может кто-нибудь объяснить, как работает типизация Scala / почему это уникально, и как это способствует масштабируемости языка?

Ответы [ 5 ]

46 голосов
/ 16 сентября 2011

Я не думаю, что существующие ответы уместны.В 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, другого языка для этого нет, хотя, безусловно, есть и другие языки, обеспечивающие возможность проверки другими способами.

20 голосов
/ 15 сентября 2011

Несколько преимуществ системы типов Scala над Java:

  1. Типы могут быть выведены во многих случаях вместо явного указания.Это удобнее, но способствует использованию сложных типов.

    val map = new Map[String, (String, String)]()

    вместо

    Map<String, Tuple<String, String>> map = new HashMap<String, Tuple<String, String>>()

  2. Функции могут быть выражены просто в системе типов.Если вы хотите увидеть, насколько это мощно, рассмотрите библиотеку гуавы как обходной путь для Java.Он невероятно ограничен и многословен (но все же полезен).

    val double = (x: Int) => x * 2

    вместо (с использованием Гуавы)

    Function<Integer, Integer> double = new Function<Integer, Integer>() { @Override public Integer apply(Integer value) { return value * 2; }}

  3. Кортежи - это тип в Scala, обходящий проблему Java, заключающуюся в возможности вернуть только одно значение.

  4. Scala поддерживает тип Varices , поэтому вы можете указать, чтоSomeObject является подтипом SomeObject, когда Cat является подтипом Thing (или когда выполняется обратное отношение).В java дженерики не являются ковариантными , что часто проблематично.

  5. Scala поддерживает ограниченную форму множественного наследования с использованием traits .В отличие от интерфейсов (из которых множественные могут быть реализованы в Java), признаки могут определять методы и переменные.

  6. Массивы прозрачно обрабатываются как любой другой класс.

  7. Вы можете добавить методы к существующим классам с помощью неявных определений.Например, вы можете добавить метод «сумма» к массивам целых чисел.

    class IntArray(value: Array[Int]) { def sumIt = value.reduceRight(_+_) }
    implicit def pimpArray(xs: Array[Int]) = new IntArray(xs)
    Array(1,2,3).sumIt
    

Это еще один хороший ресурс для некоторых из вышеперечисленных тем: http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-5

6 голосов
/ 16 сентября 2011

В дополнение к превосходному ответу schmmd, система типов Scala обладает еще более важными функциями:

  • object s - это чистая альтернатива static переменным и методам-членам в Java, например object имеет свой собственный тип и может быть передан как аргумент
  • type объявлений: вы можете определить псевдонимы для сложных типов, таких как type FactorMap[A] = Map[A, Set[Int]]
  • члены абстрактного типа в качестве альтернативы универсальному стилюtypes
  • self types
  • структурные типы
  • несколько списков аргументов для каррирования
  • неявных параметров и преобразований вместе с границами представления.Это приводит к шаблону «pimp my library» и может использоваться для имитации классов типов в стиле Haskell
  • типов высшего порядка

Последний пункт - один из моих любимых.Например, вы не можете написать простой интерфейс общего функтора на Java.Вам бы понадобилось ...

public interface Function<A,B> {
   public B apply(A a);
}

//not valid Java
public interface Functor<C> {
   public <A,B> C<B> map(Function<A,B> fn, C<A> ca);
}

Это работает, если вы заменяете какой-то конкретный тип, например List вместо C.В Java вы можете абстрагироваться от содержимого контейнера (например, написав `List), но вы не можете абстрагироваться от самого контейнера .Поверьте мне, я попытался найти лазейки (результат был this ).В Скале это бриз:

trait Functor[C[_]] {
   def map[A,B](fn: A => B, ca: C[A]):C[B]
}

object ListFunctor extends Functor[List] {
   def map[A,B](fn: A => B, ca: List[A]):List[B] = ca.map(fn)
}
3 голосов
/ 16 сентября 2011

Любая система типов, в которой вы можете кодировать HList, TList и HOF для типов, является довольно мощной ИМХО. См. http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/ для получения дополнительной информации.

0 голосов
/ 15 сентября 2011

Я не знаю, знаете ли вы Java, но представьте себе систему типов Scala, подобную этой:

  • Устраните искусственные ограничения Java в том, что вы можете делать с типами и обобщениями
  • Добавитьобщие черты функциональных языков для него
  • Инновации в области упра / наследования

Мне бы очень хотелось больше, но моя клавиатура сломалась, извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...