Я новичок в Scala, и я не мог найти многого о ключе type
. Я пытаюсь понять, что может означать следующее выражение:
type FunctorType = (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate
FunctorType
- это какой-то псевдоним, но что он означает?
Да, псевдоним типа FunctorType
является просто сокращением для
(LocalDate, HolidayCalendar, Int, Boolean) => LocalDate
Типичные псевдонимы часто используются для упрощения остальной части кода: теперь вы можете написать
def doSomeThing(f: FunctorType)
который будет интерпретироваться компилятором как
def doSomeThing(f: (LocalDate, HolidayCalendar, Int, Boolean) => LocalDate)
Это помогает избежать определения многих настраиваемых типов, которые являются, например, просто кортежами или функциями, определенными для других типов.
Есть также несколько других интересных примеров использования для type
, как описано, например, в этой главе программирования в Scala.
На самом деле ключевое слово type
в Scala может сделать гораздо больше, чем просто наложение сложного типа на более короткое имя. Он вводит члены типа.
Как вы знаете, у класса могут быть члены поля и члены метода. Ну, Scala также позволяет классу иметь члены типа.
В вашем конкретном случае type
действительно вводит псевдоним, который позволяет писать более сжатый код. Система типов просто заменяет псевдоним фактическим типом при выполнении проверки типа.
Но у вас также может быть что-то вроде этого
trait Base {
type T
def method: T
}
class Implementation extends Base {
type T = Int
def method: T = 42
}
Как и любой другой член класса, члены типа также могут быть абстрактными (вы просто не указываете, каково их значение на самом деле) и могут быть переопределены в реализациях.
Элементы типа можно рассматривать как двойственные по отношению к дженерикам, так как значительная часть вещей, которые вы можете реализовать с помощью дженериков, может быть переведена в элементы абстрактного типа.
Итак, они могут использоваться для псевдонимов, но не ограничивают их только этим, так как они являются мощной функцией системы типа Scala.
Для получения более подробной информации см. этот отличный ответ:
Просто пример того, как использовать "тип" как псевдоним:
type Action = () => Unit
В приведенном выше определении определяется действие как псевдоним типа процедур (методов), которые принимают пустой список параметров и возвращают Unit.