Понимание того, что делает ключевое слово type в Scala

103

Я новичок в Scala, и я не мог найти многого о ключе type. Я пытаюсь понять, что может означать следующее выражение:

type FunctorType = (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate

FunctorType - это какой-то псевдоним, но что он означает?

Теги:
types

3 ответа

111
Лучший ответ

Да, псевдоним типа FunctorType является просто сокращением для

(LocalDate, HolidayCalendar, Int, Boolean) => LocalDate

Типичные псевдонимы часто используются для упрощения остальной части кода: теперь вы можете написать

def doSomeThing(f: FunctorType)

который будет интерпретироваться компилятором как

def doSomeThing(f: (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate)

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

Есть также несколько других интересных примеров использования для type, как описано, например, в этой главе программирования в Scala.

154

На самом деле ключевое слово type в Scala может сделать гораздо больше, чем просто наложение сложного типа на более короткое имя. Он вводит члены типа.

Как вы знаете, у класса могут быть члены поля и члены метода. Ну, Scala также позволяет классу иметь члены типа.

В вашем конкретном случае type действительно вводит псевдоним, который позволяет писать более сжатый код. Система типов просто заменяет псевдоним фактическим типом при выполнении проверки типа.

Но у вас также может быть что-то вроде этого

trait Base {
  type T

  def method: T
}

class Implementation extends Base {
  type T = Int

  def method: T = 42
}

Как и любой другой член класса, члены типа также могут быть абстрактными (вы просто не указываете, каково их значение на самом деле) и могут быть переопределены в реализациях.

Элементы типа можно рассматривать как двойственные по отношению к дженерикам, так как значительная часть вещей, которые вы можете реализовать с помощью дженериков, может быть переведена в элементы абстрактного типа.

Итак, они могут использоваться для псевдонимов, но не ограничивают их только этим, так как они являются мощной функцией системы типа Scala.

Для получения более подробной информации см. этот отличный ответ:

Scala: абстрактные типы против дженериков

  • 41
    Важно помнить, что использование типа внутри класса создает член типа вместо псевдонима. Поэтому, если вам нужен просто псевдоним типа, определите его в объекте-компаньоне.
5

Просто пример того, как использовать "тип" как псевдоним:

type Action = () => Unit

В приведенном выше определении определяется действие как псевдоним типа процедур (методов), которые принимают пустой список параметров и возвращают Unit.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню