SlideShare una empresa de Scribd logo
1 de 29
Descargar para leer sin conexión
Scala #4
Scopes, XML, Scala type system
Scopes
Scopes - это место в коде, где может быть
объявлена переменная.
● { - начинает новый scope, кроме классов
● Каждый генератор в for statement
начинает новый scope
● Функция начинает новый scope для
параметров
● Case clause начинает новый scope
Переменная объявленная внутри одного
scope не видна снаружи.
Names shadowing
Во внутреннем scope можно скрывать имя
определенное во внешнем scope при
условии, что приоритет этого имени не ниже
чем у имени объявленного снаружи.
Это ошибка объявить переменные с одним
именем внутри одного и того же scope.
Существует два вида имен: expressions, types.
Think functional
Давайте напишем программу вывода
таблицы умножения (см. Programming Scala)
Initialization
Инициализация происходит в обратом
порядке, нежели линеаризация. Порядок
важно понимать, иначе можно заработать
NullPointerException:
Initialization
object InitializationNPE {
class A {
val x1 = "text"
val x2 = x1.length
}
class B extends A {
override val x1 = "text1"
}
def main(args: Array[String]) {
new B
}
}
Initialization
Есть два способа решить эту проблему
● Early definitions
● Lazy initialization
Early definitions
Если нужно определить что-то до вызова
super конструктора, это можно сделать в
early definitions:
class B(x: Int)
class A(s: String) extends {
val i = s.toInt
} with B(i * i)
Initialization (early defs)
object InitializationNPE {
class A {
val x1 = "text"
val x2 = x1.length
}
class B extends {
override val x1 = "text1"
} with A
def main(args: Array[String]) {
new B
}
}
Lazy values
Scala поддерживает синтиаксис ленивых
вычислений. От пользователя требуется
лишь объявить переменную, как lazy.
Реализация double-checked locking, что
приводит к определенным сложностям.
Initialization (lazy vals)
object InitializationNPE {
class A {
lazy val x1 = "text"
val x2 = x1.length
}
class B extends A {
override lazy val x1 = "text1"
}
def main(args: Array[String]) {
new B
}
}
Few words about traits
Как же компилируются traits, рассмотрим
простой пример:
trait Base {
def foo() = 1
}
class Child extends Base
Few words about traits
public interface Base {
int foo();
}
public class Base$class {
public static int foo(Base base) {
return 1;
}
}
public class Child implements Base {
public int foo() {
return Base$class.foo(this);
}
}
Embedded XML
Практически любой валидный XML можно
использовать как литерал:
val xml1 = <a>Some text<b/></a>
val xml2 = <a>{3 + 4}</a>
val xml3 = <a>{"</a>It's just String<a>"}</a>
Если надо написать {, то его можно
заэскейпить {{.
XML API
Базовый класс scala.xml.Node.
Доступ к subelement через  “name”.
К аттрибутам через  “@name”.
Рекурсивный поиск в глубину  “name”.
val xml = <a id="text"><b>S<c></c></b></a>
xml.text // S
xml  "b" // <b>S<c></c></b>
xml  "@id" // text
xml  "c" // <c></c>
Using XML
Встроенный XML легко использовать для
сериализации:
val node = <x></x>
scala.xml.XML.save("File.xml", node)
scala.xml.XML.load("File.xml")
Pattern matching
В pattern matching есть особый синтаксис
для XML:
val node = <x></x>
scala.xml.XML.save("File.xml", node)
scala.xml.XML.load("File.xml")
Scala type system
Basic types
● Primitive types
● Type designators
● Parameterized types
● Tuple types
● Function types
● Infix types
● Type projections
● Singleton types
● Annotated types
Advanced types
● Structural types
● Existential types
● Method types (internal type)
● Polymorphic method types (internal type)
● Type constructors (internal type)
Primitive types
Есть несколько важных фич:
● Numeric Widening. Если работает weak
conformance, то он автоматический.
● Literal Narrowing. Literal с ожидаемым
типом Byte, Short or Char конвертируется.
● Value discarding. Если тип Uеnit, то для
любого выражения, есть конверсия.
Value classes также наследуются от AnyVal.
Type designators
Это просто любой class, trait или object как
тип. Ничего особенного здесь не
подразумевается.
Parameterized types
Для type designator и его type parameters есть
два правила:
● Число type parameters должно of underli
совпадать с числом параметорв
соответствующего класса type designator.
● Каждый type parameter должен подходить
к type parameter bounds
Tuple types
Синтаксический сахар для TupleN[T1, ..., Tn]
типа. Subtyping разрешается также, как и
subtyping соответствующего TupleN класс
согласно вариантности.
Поэтому этот код и не скомпилируется:
object A {
def foo(x: (Int, Int)) = x._1 + x._2
def foo(x: (String, String)) = x._1 + x._2
}
Automatic tupling
Позволяет избежать лишних скобок,
особенно это полезно для infix нотации.
object A {
def foo(x: (Int, Int)) = x._1 + x._2
}
A.foo((1, 2))
A.foo(1, 2)
A foo (1, 2)
println(1, 2, 3)
Function type
Уже подробно изученный нами
синтаксический сахар. В силу недосмотра в
компиляторе это несовсем синтаксический
сахар:
val x1: Function1[Int, Int] = x => x + 1
val x2: Int => Int = _ + 1
val y1: Function1[Seq[Int], Int] = x => x.length
val y2: (Int*) => Int = x => x.length
Annotated types
Любой тип можно проаннотировать. С точки
зрения системы типов эта аннотация будет
проигнорирована:
class A
val a: A @serializable = new A
Infix types
Синтаксический сахар (опять?..)
class :::[T, S]
val x: :::[Int, Int] = new :::
val y: Int ::: Int = new :::
Infix types
Может быть полезно для операторов над
типами:
type n[A] = A => Nothing
type ++[T, U] = n[n[T] with n[U]]
type nn[A] = n[n[A]]
type |+|[T, U] = { type λ[X] = nn[X] <:< (T ++ U) }
def size[T : (Int |+| String)#λ] (t: T) = t match {
case i: Int => i
case s: String => s.length
}

Más contenido relacionado

La actualidad más candente

Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмовAndrey Dolinin
 
Coding Standards
Coding StandardsCoding Standards
Coding Standardsroadhump
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"Anatoly Levenchuk
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и ClojureAnjLab
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
этапы написания программы
этапы написания программыэтапы написания программы
этапы написания программыИрина Чернова
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 

La actualidad más candente (16)

Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмов
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Coding Standards
Coding StandardsCoding Standards
Coding Standards
 
02 if for
02 if for02 if for
02 if for
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
А.Власов. "Нижнеуровневая масштабируемая реализация ISO15926"
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и Clojure
 
структура программы
структура программыструктура программы
структура программы
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
этапы написания программы
этапы написания программыэтапы написания программы
этапы написания программы
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
 

Destacado

Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераCodeFest
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Alexander Podkhalyuzin
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Alexander Podkhalyuzin
 
Самурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программистаСамурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программистаSergey Lobin
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlangYuri Zhloba
 
Переход на Scala: босиком по граблям
Переход на Scala: босиком по граблямПереход на Scala: босиком по граблям
Переход на Scala: босиком по граблямSveta Bozhko
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit ScalaKota Mizushima
 

Destacado (20)

Feature suggester
Feature suggesterFeature suggester
Feature suggester
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
Lec 2
Lec 2Lec 2
Lec 2
 
Scala training
Scala trainingScala training
Scala training
 
Scala magic
Scala magicScala magic
Scala magic
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Erlang
ErlangErlang
Erlang
 
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
 
Scala #5
Scala #5Scala #5
Scala #5
 
Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)Under the hood of scala implicits (Scala eXchange 2014)
Under the hood of scala implicits (Scala eXchange 2014)
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Scala #3
Scala #3Scala #3
Scala #3
 
Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)Under the hood of scala implicits (kl10tch 10.03.2015)
Under the hood of scala implicits (kl10tch 10.03.2015)
 
Scala #2
Scala #2Scala #2
Scala #2
 
Самурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программистаСамурайский путь молодого Scala-программиста
Самурайский путь молодого Scala-программиста
 
Distributed erlang
Distributed erlangDistributed erlang
Distributed erlang
 
Переход на Scala: босиком по граблям
Переход на Scala: босиком по граблямПереход на Scala: босиком по граблям
Переход на Scala: босиком по граблям
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 

Similar a Scala lecture #4

особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Погружение в Dart
Погружение в DartПогружение в Dart
Погружение в DartSergey Penkovsky
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Msu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing JavaMsu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing Javaolegol
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 

Similar a Scala lecture #4 (20)

особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
лек5 6
лек5 6лек5 6
лек5 6
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Погружение в Dart
Погружение в DartПогружение в Dart
Погружение в Dart
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Bytecode
BytecodeBytecode
Bytecode
 
Scala
ScalaScala
Scala
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Msu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing JavaMsu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing Java
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 

Scala lecture #4

  • 1. Scala #4 Scopes, XML, Scala type system
  • 2. Scopes Scopes - это место в коде, где может быть объявлена переменная. ● { - начинает новый scope, кроме классов ● Каждый генератор в for statement начинает новый scope ● Функция начинает новый scope для параметров ● Case clause начинает новый scope Переменная объявленная внутри одного scope не видна снаружи.
  • 3. Names shadowing Во внутреннем scope можно скрывать имя определенное во внешнем scope при условии, что приоритет этого имени не ниже чем у имени объявленного снаружи. Это ошибка объявить переменные с одним именем внутри одного и того же scope. Существует два вида имен: expressions, types.
  • 4. Think functional Давайте напишем программу вывода таблицы умножения (см. Programming Scala)
  • 5. Initialization Инициализация происходит в обратом порядке, нежели линеаризация. Порядок важно понимать, иначе можно заработать NullPointerException:
  • 6. Initialization object InitializationNPE { class A { val x1 = "text" val x2 = x1.length } class B extends A { override val x1 = "text1" } def main(args: Array[String]) { new B } }
  • 7. Initialization Есть два способа решить эту проблему ● Early definitions ● Lazy initialization
  • 8. Early definitions Если нужно определить что-то до вызова super конструктора, это можно сделать в early definitions: class B(x: Int) class A(s: String) extends { val i = s.toInt } with B(i * i)
  • 9. Initialization (early defs) object InitializationNPE { class A { val x1 = "text" val x2 = x1.length } class B extends { override val x1 = "text1" } with A def main(args: Array[String]) { new B } }
  • 10. Lazy values Scala поддерживает синтиаксис ленивых вычислений. От пользователя требуется лишь объявить переменную, как lazy. Реализация double-checked locking, что приводит к определенным сложностям.
  • 11. Initialization (lazy vals) object InitializationNPE { class A { lazy val x1 = "text" val x2 = x1.length } class B extends A { override lazy val x1 = "text1" } def main(args: Array[String]) { new B } }
  • 12. Few words about traits Как же компилируются traits, рассмотрим простой пример: trait Base { def foo() = 1 } class Child extends Base
  • 13. Few words about traits public interface Base { int foo(); } public class Base$class { public static int foo(Base base) { return 1; } } public class Child implements Base { public int foo() { return Base$class.foo(this); } }
  • 14. Embedded XML Практически любой валидный XML можно использовать как литерал: val xml1 = <a>Some text<b/></a> val xml2 = <a>{3 + 4}</a> val xml3 = <a>{"</a>It's just String<a>"}</a> Если надо написать {, то его можно заэскейпить {{.
  • 15. XML API Базовый класс scala.xml.Node. Доступ к subelement через “name”. К аттрибутам через “@name”. Рекурсивный поиск в глубину “name”. val xml = <a id="text"><b>S<c></c></b></a> xml.text // S xml "b" // <b>S<c></c></b> xml "@id" // text xml "c" // <c></c>
  • 16. Using XML Встроенный XML легко использовать для сериализации: val node = <x></x> scala.xml.XML.save("File.xml", node) scala.xml.XML.load("File.xml")
  • 17. Pattern matching В pattern matching есть особый синтаксис для XML: val node = <x></x> scala.xml.XML.save("File.xml", node) scala.xml.XML.load("File.xml")
  • 19. Basic types ● Primitive types ● Type designators ● Parameterized types ● Tuple types ● Function types ● Infix types ● Type projections ● Singleton types ● Annotated types
  • 20. Advanced types ● Structural types ● Existential types ● Method types (internal type) ● Polymorphic method types (internal type) ● Type constructors (internal type)
  • 21. Primitive types Есть несколько важных фич: ● Numeric Widening. Если работает weak conformance, то он автоматический. ● Literal Narrowing. Literal с ожидаемым типом Byte, Short or Char конвертируется. ● Value discarding. Если тип Uеnit, то для любого выражения, есть конверсия. Value classes также наследуются от AnyVal.
  • 22. Type designators Это просто любой class, trait или object как тип. Ничего особенного здесь не подразумевается.
  • 23. Parameterized types Для type designator и его type parameters есть два правила: ● Число type parameters должно of underli совпадать с числом параметорв соответствующего класса type designator. ● Каждый type parameter должен подходить к type parameter bounds
  • 24. Tuple types Синтаксический сахар для TupleN[T1, ..., Tn] типа. Subtyping разрешается также, как и subtyping соответствующего TupleN класс согласно вариантности. Поэтому этот код и не скомпилируется: object A { def foo(x: (Int, Int)) = x._1 + x._2 def foo(x: (String, String)) = x._1 + x._2 }
  • 25. Automatic tupling Позволяет избежать лишних скобок, особенно это полезно для infix нотации. object A { def foo(x: (Int, Int)) = x._1 + x._2 } A.foo((1, 2)) A.foo(1, 2) A foo (1, 2) println(1, 2, 3)
  • 26. Function type Уже подробно изученный нами синтаксический сахар. В силу недосмотра в компиляторе это несовсем синтаксический сахар: val x1: Function1[Int, Int] = x => x + 1 val x2: Int => Int = _ + 1 val y1: Function1[Seq[Int], Int] = x => x.length val y2: (Int*) => Int = x => x.length
  • 27. Annotated types Любой тип можно проаннотировать. С точки зрения системы типов эта аннотация будет проигнорирована: class A val a: A @serializable = new A
  • 28. Infix types Синтаксический сахар (опять?..) class :::[T, S] val x: :::[Int, Int] = new ::: val y: Int ::: Int = new :::
  • 29. Infix types Может быть полезно для операторов над типами: type n[A] = A => Nothing type ++[T, U] = n[n[T] with n[U]] type nn[A] = n[n[A]] type |+|[T, U] = { type λ[X] = nn[X] <:< (T ++ U) } def size[T : (Int |+| String)#λ] (t: T) = t match { case i: Int => i case s: String => s.length }