SlideShare a Scribd company logo
Scala #5
Cake pattern, path-dependent types, HList
Self type
Можно объявлять зависимости трейта на
другие трейты. Это позволяет реализовать
DI на уровне языка.
trait A
trait B {
this: A =>
}
Difference with extends
Почему не подходит extends?
В этом случае если в А все методы
реализованы, мы можем просто забыть
добавить нужный mixin.
trait A {
def foo = "It's foo 1"
}
trait B extends A
trait C extends A {
override def foo = "It's foo 2"
}

new B //no compiler error
Difference with extends
То есть B не ведёт себя как отдельная
компонента, что противоречит идеологии
Dependency Injection.
Cake pattern
trait AComp {

trait CComp {

val a: A

this: AComp with BComp =>

class A {

def c() =

def a() = "It's A"

"It's C with " + b.b() +

}

" and " + c.c()

}

}

trait BComp {

new CComp {

val b: B

val a = new A

class B {

val b = new B

def b() = "It's B"
}
}

}
Example
Давайте напишем чайник. У него есть
интерфейс с кнопкой. Сервис нагревания.
Сервис вычисления количества воды. И
сервис проверки, что воды не меньше min и
не больше max. А также две реализации
чайника с разным min и max.
Во втором также есть сервис темературы
воды, чайник не включается, если
температура выше 98 градусов.
Path-dependent types
Напишем математически понятную
имплементацию графа:
case class Node(id: Int)
case class Edge(left: Node, right: Node)
class Graph(nodes: ArrayBuffer[Node],
edges: ArrayBuffer[Edge]) {
def connect(left: Node, right: Node) {
edges += Edge(left, right)
}
}
Path-dependent types
Но лучше было бы запретить на уровне
компилятора невозможные действия:
class Graph {
case class Node(id: Int)
case class Edge(left: Node, right: Node)
val nodes: ArrayBuffer[Node] = ???
val edges: ArrayBuffer[Edge] = ???
def connect(left: Node, right: Node) {
edges += Edge(left, right)
}
}
Abstract types
Другой пример:
abstract class Key(id: String) {
type Value
}
class DataStorage {
val data = collection.mutable.Map[Key, Any]
def get(key: Key): Option[key.Value] = ???
def set(key: Key)(value: key.Value) = ???
}
object Keys {
trait StringKey {
this: Key =>
type Value = String
}
val nameKey = new Key("name") with StringKey
}
Graph example
Давайте напишем граф, который может
быть расширен несколькими вариантами:
● Обычный граф
● Цветной граф
● Ориентированный граф
Heterogeneous list
А теперь напишем HList, который состоит из
HNil, HCons, а также есть метод concat,
который умеет объединять два списка.

More Related Content

PPT
верификация
DOC
Matlab: Вычисление предела
PPT
ФИЛП
PPT
графические возможности паскаль
PPT
лекция 2
PPT
ветвления
PPT
бомба для графики в паскаль
верификация
Matlab: Вычисление предела
ФИЛП
графические возможности паскаль
лекция 2
ветвления
бомба для графики в паскаль

What's hot (20)

PPT
операторы цикла в Visual basic
PDF
метод наименьших квадратов
PPTX
использование линейных алгоритмов для решения задач
PPTX
указатель на функцию
PPT
Ispolzovanie lineynykh algoritmov_dlya_reshenia
PDF
Оптимизация в мире 64-битных ошибок
PDF
4.4 Таблица виртуальных методов
PPTX
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
PPT
Алгоритмическая конструкция Повторение
DOCX
«Анимация в PascalABC»
PDF
3.6 Константность
PPTX
8 оператор цикла с параметром
PPTX
Использование алгоритмов для решения задач
PPTX
ветвление.условный оператор.циклы
PPTX
Pri3
PDF
5.4 Ключевые слова static и inline
PDF
3.2 Методы
PPTX
Goto
PDF
2.3 Указатели и массивы
операторы цикла в Visual basic
метод наименьших квадратов
использование линейных алгоритмов для решения задач
указатель на функцию
Ispolzovanie lineynykh algoritmov_dlya_reshenia
Оптимизация в мире 64-битных ошибок
4.4 Таблица виртуальных методов
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Алгоритмическая конструкция Повторение
«Анимация в PascalABC»
3.6 Константность
8 оператор цикла с параметром
Использование алгоритмов для решения задач
ветвление.условный оператор.циклы
Pri3
5.4 Ключевые слова static и inline
3.2 Методы
Goto
2.3 Указатели и массивы
Ad

Viewers also liked (20)

PDF
Under the hood of scala implicits (kl10tch 10.03.2015)
PDF
PDF
Павел Павлов - Scala для профессионалов - Joker 2013
PDF
Scala lecture #4
PDF
Backend: Пишем на Scala для браузера
PDF
Feature suggester
PDF
Scala training
PPTX
Scala для всех (РИФ 2015)
PDF
PDF
Under the hood of scala implicits (Scala eXchange 2014)
PDF
PPTX
Самурайский путь молодого Scala-программиста
ODP
Distributed erlang
PDF
Переход на Scala: босиком по граблям
PDF
Scala performance под капотом
PDF
Implicit Implicit Scala
PDF
Clojure #2 (2014)
Under the hood of scala implicits (kl10tch 10.03.2015)
Павел Павлов - Scala для профессионалов - Joker 2013
Scala lecture #4
Backend: Пишем на Scala для браузера
Feature suggester
Scala training
Scala для всех (РИФ 2015)
Under the hood of scala implicits (Scala eXchange 2014)
Самурайский путь молодого Scala-программиста
Distributed erlang
Переход на Scala: босиком по граблям
Scala performance под капотом
Implicit Implicit Scala
Clojure #2 (2014)
Ad

Similar to Scala #5 (19)

PDF
Scala and LiftWeb presentation (Russian)
PPTX
Kotlin
PDF
Scala
PDF
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
PDF
Groovy presentation.
PDF
Lift, play, akka, rails part1
PPTX
Scala in 10 minutes
PDF
Kotlin на практике
PDF
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
PDF
Архитектура в Agile: слабая связность
PDF
Теории и практики функционального программирования.
PDF
Язык программирования Scala / Владимир Успенский (TCS Bank)
PDF
Scala, SBT & Play! for Rapid Application Development
PDF
Теории и практики фунционального программирования - GDG D2D
PDF
Kotlin для Android
PDF
Scala: что, как и зачем?
PDF
Scala for Android Explained
PPTX
Зачем нужна Scala?
PDF
GraphQL API: Patterns | Андрей Чиж | Zlit Tech
Scala and LiftWeb presentation (Russian)
Kotlin
Scala
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Groovy presentation.
Lift, play, akka, rails part1
Scala in 10 minutes
Kotlin на практике
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Архитектура в Agile: слабая связность
Теории и практики функционального программирования.
Язык программирования Scala / Владимир Успенский (TCS Bank)
Scala, SBT & Play! for Rapid Application Development
Теории и практики фунционального программирования - GDG D2D
Kotlin для Android
Scala: что, как и зачем?
Scala for Android Explained
Зачем нужна Scala?
GraphQL API: Patterns | Андрей Чиж | Zlit Tech

Scala #5

  • 1. Scala #5 Cake pattern, path-dependent types, HList
  • 2. Self type Можно объявлять зависимости трейта на другие трейты. Это позволяет реализовать DI на уровне языка. trait A trait B { this: A => }
  • 3. Difference with extends Почему не подходит extends? В этом случае если в А все методы реализованы, мы можем просто забыть добавить нужный mixin. trait A { def foo = "It's foo 1" } trait B extends A trait C extends A { override def foo = "It's foo 2" } new B //no compiler error
  • 4. Difference with extends То есть B не ведёт себя как отдельная компонента, что противоречит идеологии Dependency Injection.
  • 5. Cake pattern trait AComp { trait CComp { val a: A this: AComp with BComp => class A { def c() = def a() = "It's A" "It's C with " + b.b() + } " and " + c.c() } } trait BComp { new CComp { val b: B val a = new A class B { val b = new B def b() = "It's B" } } }
  • 6. Example Давайте напишем чайник. У него есть интерфейс с кнопкой. Сервис нагревания. Сервис вычисления количества воды. И сервис проверки, что воды не меньше min и не больше max. А также две реализации чайника с разным min и max. Во втором также есть сервис темературы воды, чайник не включается, если температура выше 98 градусов.
  • 7. Path-dependent types Напишем математически понятную имплементацию графа: case class Node(id: Int) case class Edge(left: Node, right: Node) class Graph(nodes: ArrayBuffer[Node], edges: ArrayBuffer[Edge]) { def connect(left: Node, right: Node) { edges += Edge(left, right) } }
  • 8. Path-dependent types Но лучше было бы запретить на уровне компилятора невозможные действия: class Graph { case class Node(id: Int) case class Edge(left: Node, right: Node) val nodes: ArrayBuffer[Node] = ??? val edges: ArrayBuffer[Edge] = ??? def connect(left: Node, right: Node) { edges += Edge(left, right) } }
  • 9. Abstract types Другой пример: abstract class Key(id: String) { type Value } class DataStorage { val data = collection.mutable.Map[Key, Any] def get(key: Key): Option[key.Value] = ??? def set(key: Key)(value: key.Value) = ??? } object Keys { trait StringKey { this: Key => type Value = String } val nameKey = new Key("name") with StringKey }
  • 10. Graph example Давайте напишем граф, который может быть расширен несколькими вариантами: ● Обычный граф ● Цветной граф ● Ориентированный граф
  • 11. Heterogeneous list А теперь напишем HList, который состоит из HNil, HCons, а также есть метод concat, который умеет объединять два списка.