SlideShare una empresa de Scribd logo
1 de 11
Descargar para leer sin conexión
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,
который умеет объединять два списка.

Más contenido relacionado

La actualidad más candente

операторы цикла в Visual basic
операторы цикла в Visual basicоператоры цикла в Visual basic
операторы цикла в Visual basicanastastish
 
метод наименьших квадратов
метод наименьших квадратовметод наименьших квадратов
метод наименьших квадратовЕлена Ключева
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачДарья Димитрова
 
указатель на функцию
указатель на функциюуказатель на функцию
указатель на функциюAleksandr Pavlenko
 
Ispolzovanie lineynykh algoritmov_dlya_reshenia
Ispolzovanie lineynykh algoritmov_dlya_resheniaIspolzovanie lineynykh algoritmov_dlya_reshenia
Ispolzovanie lineynykh algoritmov_dlya_resheniaTSA112
 
Оптимизация в мире 64-битных ошибок
Оптимизация  в мире 64-битных ошибокОптимизация  в мире 64-битных ошибок
Оптимизация в мире 64-битных ошибокTatyanazaxarova
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методовDEVTYPE
 
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Alexander Borzunov
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеAndrey Dolinin
 
«Анимация в PascalABC»
«Анимация в PascalABC»«Анимация в PascalABC»
«Анимация в PascalABC»ValiaKuba
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 КонстантностьDEVTYPE
 
Использование алгоритмов для решения задач
Использование алгоритмов для решения задачИспользование алгоритмов для решения задач
Использование алгоритмов для решения задачalklimchuk
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклыdasha2012
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inlineDEVTYPE
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 МетодыDEVTYPE
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивыDEVTYPE
 

La actualidad más candente (20)

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

Destacado

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 для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
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-программиста
Самурайский путь молодого 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)

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)
 
Lec 2
Lec 2Lec 2
Lec 2
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Backend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузераBackend: Пишем на Scala для браузера
Backend: Пишем на Scala для браузера
 
Scala #4
Scala #4Scala #4
Scala #4
 
Feature suggester
Feature suggesterFeature suggester
Feature suggester
 
Scala #3
Scala #3Scala #3
Scala #3
 
Scala training
Scala trainingScala training
Scala training
 
Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)Scala для всех (РИФ 2015)
Scala для всех (РИФ 2015)
 
Scala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEAScala plugin for IntelliJ IDEA
Scala plugin for IntelliJ IDEA
 
Scala #2
Scala #2Scala #2
Scala #2
 
Scala magic
Scala magicScala magic
Scala magic
 
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)
 
Erlang
ErlangErlang
Erlang
 
Самурайский путь молодого 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
 

Similar a Scala #5

Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellFProg
 
операторы и выражения
операторы и выраженияоператоры и выражения
операторы и выраженияLidiKashka
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?Tatyanazaxarova
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Moscow.pm
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 

Similar a Scala #5 (20)

Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Евгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в HaskellЕвгений Котельников. Зависимые типы в Haskell
Евгений Котельников. Зависимые типы в Haskell
 
операторы и выражения
операторы и выраженияоператоры и выражения
операторы и выражения
 
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The BeastAlexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?О сложностях программирования, или C# нас не спасет?
О сложностях программирования, или C# нас не спасет?
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
алгоритм
алгоритмалгоритм
алгоритм
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 

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, который умеет объединять два списка.