SlideShare a Scribd company logo
Scala для всех
Арсений Жижелев, Мэйл.Ру Геймз
Предыстория
Мартин Одерски (Martin Odersky, 1958) —
немецкий учёный в области компьютерных наук
и профессор EPFL в Швейцарии.
Специализируется на статическом анализе
кода и языках программирования. Разработал
язык программирования Scala, поддержку
Generics в Java и создал текущую версию javac,
компилятора языка Java.
В 2011 основал Typesafe, компанию, которая
ставит своей целью поддержку и
популяризацию языка Scala.
(Википедия)
Мартин Одерски
Мартин Одерски
Scalable
• лаконичный синтаксис упрощает написание
интеграционных скриптов (в 2-4 раза короче
Java)
• практически все, что можно сделать в Java,
можно сделать и в Scala
• поддержка многопоточного программирования
(immutable)
• строгая типизация защищает от ошибок
• развитые средства модульности и
абстрагирования
• основные конструкции языка используются и в
маленьких программах, и в больших
Принципы Scala дизайна
"Глубокий", а не "широкий" язык
• мало конструкций, но они очень
мощные и выразительные.
• "широта" охвата достигается за счёт
библиотек.
• Гибкость != простота
A1: Scala = Java++
Java без ‘;’
 вывод ‘;’
 вывод типов
 case class’ы
 лаконичные объявления
 удобные коллекции
Java++
 Полноценные generic’и с ко- и контра-
вариантностью
 cake pattern (альтернатива dependency
injection)
 вычисления на типах
 implicit’ы (type classes)
 HList‘ы
 метапрограммирование (макросы)
 …
I. Scala: Примеры программ
A0: Hello, World!
• Синглетоны
• Тело объекта - конструктор
• App – содержит main(args)
• println – простая функция, объявлена в Predef
object Hello extends App {
println("Hello, World!")
}
Scala:
Простой калькулятор
sealed abstract class Tree
case class BinOp(op: Op, l: Tree, r: Tree) extends Tree
case class Var (n: String) extends Tree
case class Const(v: Int) extends Tree
sealed abstract class Op
case object Add extends Op
case object Mul extends Op
Scala: expression tree (1)
AST – абстрактное синтаксическое дерево
• Аргументы класса  конструктор
• case class – аргументы класса  поля и
свойства; equals и hashCode
• case object – синглетон
• sealed – все потомки объявлены в этом же
файле
• классы-однострочники!
type Environment = String => Int
def eval(t: Tree, env: Environment): Int =
t match {
case BinOp(Add, l, r) =>
eval(l, env) + eval(r, env)
case BinOp(Mul, l, r) =>
eval(l, env) * eval(r, env)
case Var(n) => env(n)
case Const(v) => v
}
Scala: expression tree (2)
вычисление
• type alias (в т.ч. с аргументами)
• тип функции
• pattern matching
• несколько списков аргументов
val operations = Map[Op, (Int, Int) => Int](
Add -> ((x:Int, y:Int) => x+y),
Mul -> (_ * _)
)
def eval2(env: Environment)(t: Tree): Int =
t match {
case BinOp(op, l, r) =>
operations(op)(
eval2(env)(l), eval2(env)(r))
case Var(n) => env(n)
case Const(v) => v
}
Scala: expression tree (3)
операции как функции
// Div -> div(_,_)
// def div(x:Int, y:Int) = x/y
• Конструктор map’а
• функции-лямбды
• автоаргументы _
• несколько списков
аргументов – функцию
можно частично
применять (curry)
Scala: expression tree (4)
Разбор строки PEG
object SimpleExpressionsParser extends JavaTokenParsers {
def tree: Parser[Tree] = binOp | elem
def binOp: Parser[BinOp] = elem ~ op ~ elem ^^ {
case l ~ op ~ r => BinOp(op, l, r)
}
def elem = var1 | const
def op : Parser[Op] = '+' ^^ { case _ => Add } |
'*' ^^ { case _ => Mul }
def var1: Parser[Var] = ident ^^ Var
def const:Parser[Const] = wholeNumber ^^ {case n => Const(n.toInt)}
} def parse(str:String):Tree = parseAll(tree,str) match {
case Success(result) => result
case NoSuccess(msg,_) => throw new IllegalArgumentException(msg)
}
Scala: expression tree (5)
REPL – read eval print loop
object Calc extends App with CalcExpressions {
while(true){
val input = Console.readLine(">")
val tree = SimpleExpressionsParser.parse(input)
val result = eval(tree, empty)
println(result)
}
}
Scala:
Решето Эратосфена
trait PrimeNumbers {
/** Параметр – максимальное рассматриваемое число.*/
val MaxPrime:Int
/** Проверка, i – простое? */
def isPrime(i:Int):Boolean
/** Разложение на множители.*/
def factors(i:Int):List[Int]
protected
def ensureRange(i:Int) = {
require(i<MaxPrime,
s"Argument i=$i is too big (>$MaxPrime).")
i
}
}
Scala: решето Эратосфена (1)
• trait – основа модульности +
dependency injection
• абстрактные объявления и
реализации
• require ~ assert
• string interpolation
• вывод типов
trait PrimeNumbersDivisors extends PrimeNumbers {
require(MaxPrime > 1, "Max prime should be > 1")
lazy val divisors = {
val arr = new Array[Int](MaxPrime)
arr(0) = 1
arr(1) = 1
for {i <- 2 to math.sqrt(MaxPrime).floor.toInt
if arr(i) == 0 // ==> i – простое
} {
arr(i) = 1 // 1 – признак простого числа
for {j <- i * i until MaxPrime by i
if arr(j) == 0} // j – нет делителей меньше
arr(j) = i // запомним первый делитель
}
arr.toSeq // превращаем в немодифицируемую коллекцию
}
}
Scala: решето Эратосфена (2)
• for – не цикл!
• for – что-то вроде объявления
множества: {x| x<10}
• метод to создаёт диапазон [2,
sqrt(MaxPrime)]
• метод by преобразует диапазон к
диапазону с шагом
• lazy val – ленивые вычисления
trait PrimeNumbersImplIsPrime extends PrimeNumbersDivisors {
def isPrime(i:Int) =
divisors(ensureRange(i)) == 1
}
Scala: решето Эратосфена (3)
• наследование trait’а
trait PrimeNumbersImplFactors extends PrimeNumbersDivisors {
import scala.annotation.tailrec
/** Разложение числа на множители.
* @return список простых множителей, включая 1. */
def factors(i:Int) = {
@tailrec def factors0(j:Int, result:List[Int]):List[Int] =
if(divisors(j) == 1)
1 :: j :: result
else
factors0(j/divisors(j),
divisors(j) :: result)
factors0(ensureRange(i), List())
}
}
Scala: решето Эратосфена (4)
• объявления – в любом месте, не
засоряем область видимости,
почти не нужны private
• оптимизация хвостовой рекурсии
• tailrec – аннотация (компилятор
сообщит, если оптимизация не
сработает)
• import в любом месте
• правоассоциативные методы …:
• конструктор списка :: = cons
object PrimeNumbersAll extends PrimeNumbersDivisors
with PrimeNumbersImplIsPrime
with PrimeNumbersImplFactors
{
val MaxPrime = 1000
}
Scala: решето Эратосфена (5)
cake pattern
• собираем все объявления из
trait’ов.
• даём значение абстрактному
элементу
• линеаризация – решение
diamond-проблемы
Scala:
Комплексные числа
sealed trait Complex
case class CartesianComplex(x:Double, y:Double) extends Complex
case class PolarComplex(r:Double, phi:Double) extends Complex
def add(n1:CartesianComplex, n2:CartesianComplex) =
CartesianComplex(n1.x+n2.x, n1.y+n2.y)
def mul(n1:PolarComplex,n2:PolarComplex) =
PolarComplex(n1.r*n2.r, n1.phi+n2.phi)
Scala: комплексные числа (1)
• Чистые данные
• add удобнее делать в одной
форме
• mul – в другой
implicit def toPolar(c:Complex):PolarComplex = c match {
case CartesianComplex(x,y) =>
PolarComplex(math.sqrt(x*x+y*y), math.atan2(y,x))
case p:PolarComplex => p
}
implicit def toCartesian(c:Complex):CartesianComplex = ???
implicit class ComplexOps(c:Complex){
def +(other:Complex) =
add(c,other)
def *(other:Complex) =
mul(c,other)
}
Scala: комплексные числа (2)
implicit’ы
• implicit конвертация
• методы расширения
• операторы – тоже методы
• ??? – метод, генерирующий
исключение "not implemented"
Scala:
Коллекции
Scala: immutable коллекции (1)
конструкторы
• конструкторы коллекций
соответствующих типов
• -> - создаёт пару
• 'str – создаёт Symbol("str")
• :: - правоассоциативный метод,
приклеивает новый элемент
слева от списка
• коллекции immutable (отдельно
есть комплект mutable-коллекций)
immutable – основа многопоточности
• val
• case class'ы
• immutable коллекции
val list = List(1,2,3,4,5,6)
val empty = Set()
val days = Map(1 -> 'Пн, 2 -> 'Вт,
3 -> 'Ср, 4 -> 'Чт,
5 -> 'Пт, 6 -> 'Сб,
7 -> 'Вс)
val list2 = 1 :: 2 :: 3 ::
4 :: 5 :: 6 :: Nil
assert(list == list2)
val days2 = "Пн Вт Ср Чт Пт Сб Вс".
split(" ").
zipWithIndex.
map{ case (day, index) =>
(index+1, Symbol(day)) }.
toMap
assert(days == days2)
val even = list.filter(_ % 2 == 0)
Scala: immutable коллекции (2)
преобразования
• split – разбивает по regex'ам
• zipWithIndex – к каждому
элементу приклеивает номер
• map – применяет функцию к
каждому элементу
• toMap – конвертирует коллекцию
Scala: immutable коллекции (3)
for
• divisors – ранее объявленная
коллекция (содержит
минимальный делитель индекса)
• (divisor, index) <-
извлекает из коллекции по-
элементно. Т.к. каждый элемент,
пара, то сразу разбивает пару на
две переменные – divisor, index
• yield включает значение в
результирующую коллекцию
• for … yield – определение
множества через свойства
элементов:
P = {index | index in N,
divisors(index)=1}
val primeNumbers =
for{ (divisor, index) <-
PrimeNumbersAll.divisors.toSeq.
zipWithIndex
if divisor == 1 &&
index>1 // исключаем 0 и 1
} yield index
Scala:
Кортежи
Scala: кортежи (1)
деление с остатком
• (*,*) –
• пара элементов,
• тип пары элементов,
• конструктор пары
элементов,
• деконструктор пары
элементов
• * -> * - конструктор пары
элементов
def divide(a:Int,b:Int):(Int, Int) =
(a/b, a%b)
val (quotinent, residue) = divide(15,6)
assert(residue == 3)
Scala: кортежи (2)
• (*,*,*) – тройка
• каждый элемент имеет свой тип
• всего кортежи объявлены до 22.
• `4-ка` - объявление имени,
содержащего любые
спецсимволы. Удобно для
математических задач, например.
val triple = (1, "one", true)
assert(triple._3)
assert(triple._2.length == 3)
val `4-ка` = (1, true, List(3,4), 1->2)
assert(`4-ка`._3.head == 3)
val `[0..1000)` = 0 until 1000
val `[0,10,20..1000)` = 0 until 1000 by 10
II. Scala: Разное
Scala: persistent data structures
Scala: ортогональный дизайн
Scala: Кто использует?
http://typesafe.com/company/casestudies
Siemens Novell Atos Tumbler
Scala: learning curve
“java без ;”
collections
Pattern matching
implicits
Covariant/contravariant
type algebra
время, лет
мастерство
…
Пример JavaLike
Scala: производительность
• Slick 3.0 – типизированный доступ к базам данных
• Akka – параллельные и распределённые системы
• SynapseGrid – фреймворк для описания параллельных систем реального времени (FRP)
• Play – веб-фреймворк (aka «Ruby on Rails на стероидах») (есть ещё Spray, Lift, Scalatra и др.)
• Apache Spark – Big Data фреймворк
• Shapeless, Scalaz, Monocle – библиотеки для работы с типами высших порядков
• ScalaFX – библиотека для создания GUI на основе JavaFX (есть ещё Scala-swing)
• Parboiled2 – создание parser-комбинаторов
• ScalaTest, Specs2 – библиотеки для создания тестов
• Scala Async – библиотека для написания линейного кода с блокировками, который будет
преобразован в код без блокировок
• Scala.js – кросс-компилятор Scala в JavaScript
Scala: библиотеки
(см. github/scala-awesome)
СПАСИБО ЗА ВНИМАНИЕ
a.zhizhelev@corp.mail.ru
https://github.com/Primetalk/SynapseGrid

More Related Content

PDF
Scala: что, как и зачем?
PDF
Павел Павлов - Scala для профессионалов - Joker 2013
PDF
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
PPTX
Javascript 1
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PDF
Haskell
PPTX
Clojure: Lisp for the modern world (русская версия)
PPTX
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
Scala: что, как и зачем?
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Javascript 1
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Haskell
Clojure: Lisp for the modern world (русская версия)
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...

What's hot (18)

PDF
Scala and LiftWeb presentation (Russian)
PDF
Groovy presentation.
PDF
Внешние языки DSL на funcparserlib
PDF
Лекция 11. Тестирование.
PDF
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
PDF
Лекция 12. Быстрее, Python, ещё быстрее.
PDF
Михаил Давыдов: JavaScript. Базовые знания
PPTX
Александр Фокин, Рефлексия в C++
PDF
Formal verification of C code
PPTX
C#. От основ к эффективному коду
PDF
AOT для Java: Мифы и Challenges
PDF
модель акторов и C++ что, зачем и как ?
PDF
Лекция 1. Начало.
PDF
Лекция 2. Всё, что вы хотели знать о функциях в Python.
PDF
Лекция 4. Строки, байты, файлы и ввод/вывод.
PDF
Лекция 6. Классы 1.
PDF
Язык программирования Scala / Владимир Успенский (TCS Bank)
PDF
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Scala and LiftWeb presentation (Russian)
Groovy presentation.
Внешние языки DSL на funcparserlib
Лекция 11. Тестирование.
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Лекция 12. Быстрее, Python, ещё быстрее.
Михаил Давыдов: JavaScript. Базовые знания
Александр Фокин, Рефлексия в C++
Formal verification of C code
C#. От основ к эффективному коду
AOT для Java: Мифы и Challenges
модель акторов и C++ что, зачем и как ?
Лекция 1. Начало.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 6. Классы 1.
Язык программирования Scala / Владимир Успенский (TCS Bank)
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
Ad

Viewers also liked (20)

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

Similar to Scala для всех (РИФ 2015) (20)

ODP
PDF
Лекция 12. Spark
PDF
Scala for android
PPTX
Зачем нужна Scala?
PPTX
Функциональное программирование на F#
PDF
Лекция #5. Введение в язык программирования Python 3
PDF
Scala, SBT & Play! for Rapid Application Development
PDF
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
PDF
Haskell Lite - presentation for DevDay about Haskell language
PDF
Вторая лекция по основам ruby для студентов itc73.ru
PDF
13 - Hadoop. Парадигма Spark
PDF
Курсы актерского мастерства
PDF
ОПК № 5 – Составные типы данных, списки
PDF
Python и его тормоза
KEY
Отличие Erlang от объектных языков
PPTX
Bytecode
PPTX
Принципы работы статического анализатора кода PVS-Studio
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
PPT
массивы
Лекция 12. Spark
Scala for android
Зачем нужна Scala?
Функциональное программирование на F#
Лекция #5. Введение в язык программирования Python 3
Scala, SBT & Play! for Rapid Application Development
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Haskell Lite - presentation for DevDay about Haskell language
Вторая лекция по основам ruby для студентов itc73.ru
13 - Hadoop. Парадигма Spark
Курсы актерского мастерства
ОПК № 5 – Составные типы данных, списки
Python и его тормоза
Отличие Erlang от объектных языков
Bytecode
Принципы работы статического анализатора кода PVS-Studio
Объектно-ориентированное программирование. Лекции 9 и 10
массивы

Scala для всех (РИФ 2015)

  • 1. Scala для всех Арсений Жижелев, Мэйл.Ру Геймз
  • 3. Мартин Одерски (Martin Odersky, 1958) — немецкий учёный в области компьютерных наук и профессор EPFL в Швейцарии. Специализируется на статическом анализе кода и языках программирования. Разработал язык программирования Scala, поддержку Generics в Java и создал текущую версию javac, компилятора языка Java. В 2011 основал Typesafe, компанию, которая ставит своей целью поддержку и популяризацию языка Scala. (Википедия) Мартин Одерски Мартин Одерски
  • 4. Scalable • лаконичный синтаксис упрощает написание интеграционных скриптов (в 2-4 раза короче Java) • практически все, что можно сделать в Java, можно сделать и в Scala • поддержка многопоточного программирования (immutable) • строгая типизация защищает от ошибок • развитые средства модульности и абстрагирования • основные конструкции языка используются и в маленьких программах, и в больших Принципы Scala дизайна "Глубокий", а не "широкий" язык • мало конструкций, но они очень мощные и выразительные. • "широта" охвата достигается за счёт библиотек. • Гибкость != простота
  • 5. A1: Scala = Java++ Java без ‘;’  вывод ‘;’  вывод типов  case class’ы  лаконичные объявления  удобные коллекции Java++  Полноценные generic’и с ко- и контра- вариантностью  cake pattern (альтернатива dependency injection)  вычисления на типах  implicit’ы (type classes)  HList‘ы  метапрограммирование (макросы)  …
  • 6. I. Scala: Примеры программ
  • 7. A0: Hello, World! • Синглетоны • Тело объекта - конструктор • App – содержит main(args) • println – простая функция, объявлена в Predef object Hello extends App { println("Hello, World!") }
  • 9. sealed abstract class Tree case class BinOp(op: Op, l: Tree, r: Tree) extends Tree case class Var (n: String) extends Tree case class Const(v: Int) extends Tree sealed abstract class Op case object Add extends Op case object Mul extends Op Scala: expression tree (1) AST – абстрактное синтаксическое дерево • Аргументы класса  конструктор • case class – аргументы класса  поля и свойства; equals и hashCode • case object – синглетон • sealed – все потомки объявлены в этом же файле • классы-однострочники!
  • 10. type Environment = String => Int def eval(t: Tree, env: Environment): Int = t match { case BinOp(Add, l, r) => eval(l, env) + eval(r, env) case BinOp(Mul, l, r) => eval(l, env) * eval(r, env) case Var(n) => env(n) case Const(v) => v } Scala: expression tree (2) вычисление • type alias (в т.ч. с аргументами) • тип функции • pattern matching • несколько списков аргументов
  • 11. val operations = Map[Op, (Int, Int) => Int]( Add -> ((x:Int, y:Int) => x+y), Mul -> (_ * _) ) def eval2(env: Environment)(t: Tree): Int = t match { case BinOp(op, l, r) => operations(op)( eval2(env)(l), eval2(env)(r)) case Var(n) => env(n) case Const(v) => v } Scala: expression tree (3) операции как функции // Div -> div(_,_) // def div(x:Int, y:Int) = x/y • Конструктор map’а • функции-лямбды • автоаргументы _ • несколько списков аргументов – функцию можно частично применять (curry)
  • 12. Scala: expression tree (4) Разбор строки PEG object SimpleExpressionsParser extends JavaTokenParsers { def tree: Parser[Tree] = binOp | elem def binOp: Parser[BinOp] = elem ~ op ~ elem ^^ { case l ~ op ~ r => BinOp(op, l, r) } def elem = var1 | const def op : Parser[Op] = '+' ^^ { case _ => Add } | '*' ^^ { case _ => Mul } def var1: Parser[Var] = ident ^^ Var def const:Parser[Const] = wholeNumber ^^ {case n => Const(n.toInt)} } def parse(str:String):Tree = parseAll(tree,str) match { case Success(result) => result case NoSuccess(msg,_) => throw new IllegalArgumentException(msg) }
  • 13. Scala: expression tree (5) REPL – read eval print loop object Calc extends App with CalcExpressions { while(true){ val input = Console.readLine(">") val tree = SimpleExpressionsParser.parse(input) val result = eval(tree, empty) println(result) } }
  • 15. trait PrimeNumbers { /** Параметр – максимальное рассматриваемое число.*/ val MaxPrime:Int /** Проверка, i – простое? */ def isPrime(i:Int):Boolean /** Разложение на множители.*/ def factors(i:Int):List[Int] protected def ensureRange(i:Int) = { require(i<MaxPrime, s"Argument i=$i is too big (>$MaxPrime).") i } } Scala: решето Эратосфена (1) • trait – основа модульности + dependency injection • абстрактные объявления и реализации • require ~ assert • string interpolation • вывод типов
  • 16. trait PrimeNumbersDivisors extends PrimeNumbers { require(MaxPrime > 1, "Max prime should be > 1") lazy val divisors = { val arr = new Array[Int](MaxPrime) arr(0) = 1 arr(1) = 1 for {i <- 2 to math.sqrt(MaxPrime).floor.toInt if arr(i) == 0 // ==> i – простое } { arr(i) = 1 // 1 – признак простого числа for {j <- i * i until MaxPrime by i if arr(j) == 0} // j – нет делителей меньше arr(j) = i // запомним первый делитель } arr.toSeq // превращаем в немодифицируемую коллекцию } } Scala: решето Эратосфена (2) • for – не цикл! • for – что-то вроде объявления множества: {x| x<10} • метод to создаёт диапазон [2, sqrt(MaxPrime)] • метод by преобразует диапазон к диапазону с шагом • lazy val – ленивые вычисления
  • 17. trait PrimeNumbersImplIsPrime extends PrimeNumbersDivisors { def isPrime(i:Int) = divisors(ensureRange(i)) == 1 } Scala: решето Эратосфена (3) • наследование trait’а
  • 18. trait PrimeNumbersImplFactors extends PrimeNumbersDivisors { import scala.annotation.tailrec /** Разложение числа на множители. * @return список простых множителей, включая 1. */ def factors(i:Int) = { @tailrec def factors0(j:Int, result:List[Int]):List[Int] = if(divisors(j) == 1) 1 :: j :: result else factors0(j/divisors(j), divisors(j) :: result) factors0(ensureRange(i), List()) } } Scala: решето Эратосфена (4) • объявления – в любом месте, не засоряем область видимости, почти не нужны private • оптимизация хвостовой рекурсии • tailrec – аннотация (компилятор сообщит, если оптимизация не сработает) • import в любом месте • правоассоциативные методы …: • конструктор списка :: = cons
  • 19. object PrimeNumbersAll extends PrimeNumbersDivisors with PrimeNumbersImplIsPrime with PrimeNumbersImplFactors { val MaxPrime = 1000 } Scala: решето Эратосфена (5) cake pattern • собираем все объявления из trait’ов. • даём значение абстрактному элементу • линеаризация – решение diamond-проблемы
  • 21. sealed trait Complex case class CartesianComplex(x:Double, y:Double) extends Complex case class PolarComplex(r:Double, phi:Double) extends Complex def add(n1:CartesianComplex, n2:CartesianComplex) = CartesianComplex(n1.x+n2.x, n1.y+n2.y) def mul(n1:PolarComplex,n2:PolarComplex) = PolarComplex(n1.r*n2.r, n1.phi+n2.phi) Scala: комплексные числа (1) • Чистые данные • add удобнее делать в одной форме • mul – в другой
  • 22. implicit def toPolar(c:Complex):PolarComplex = c match { case CartesianComplex(x,y) => PolarComplex(math.sqrt(x*x+y*y), math.atan2(y,x)) case p:PolarComplex => p } implicit def toCartesian(c:Complex):CartesianComplex = ??? implicit class ComplexOps(c:Complex){ def +(other:Complex) = add(c,other) def *(other:Complex) = mul(c,other) } Scala: комплексные числа (2) implicit’ы • implicit конвертация • методы расширения • операторы – тоже методы • ??? – метод, генерирующий исключение "not implemented"
  • 24. Scala: immutable коллекции (1) конструкторы • конструкторы коллекций соответствующих типов • -> - создаёт пару • 'str – создаёт Symbol("str") • :: - правоассоциативный метод, приклеивает новый элемент слева от списка • коллекции immutable (отдельно есть комплект mutable-коллекций) immutable – основа многопоточности • val • case class'ы • immutable коллекции val list = List(1,2,3,4,5,6) val empty = Set() val days = Map(1 -> 'Пн, 2 -> 'Вт, 3 -> 'Ср, 4 -> 'Чт, 5 -> 'Пт, 6 -> 'Сб, 7 -> 'Вс) val list2 = 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: Nil assert(list == list2)
  • 25. val days2 = "Пн Вт Ср Чт Пт Сб Вс". split(" "). zipWithIndex. map{ case (day, index) => (index+1, Symbol(day)) }. toMap assert(days == days2) val even = list.filter(_ % 2 == 0) Scala: immutable коллекции (2) преобразования • split – разбивает по regex'ам • zipWithIndex – к каждому элементу приклеивает номер • map – применяет функцию к каждому элементу • toMap – конвертирует коллекцию
  • 26. Scala: immutable коллекции (3) for • divisors – ранее объявленная коллекция (содержит минимальный делитель индекса) • (divisor, index) <- извлекает из коллекции по- элементно. Т.к. каждый элемент, пара, то сразу разбивает пару на две переменные – divisor, index • yield включает значение в результирующую коллекцию • for … yield – определение множества через свойства элементов: P = {index | index in N, divisors(index)=1} val primeNumbers = for{ (divisor, index) <- PrimeNumbersAll.divisors.toSeq. zipWithIndex if divisor == 1 && index>1 // исключаем 0 и 1 } yield index
  • 28. Scala: кортежи (1) деление с остатком • (*,*) – • пара элементов, • тип пары элементов, • конструктор пары элементов, • деконструктор пары элементов • * -> * - конструктор пары элементов def divide(a:Int,b:Int):(Int, Int) = (a/b, a%b) val (quotinent, residue) = divide(15,6) assert(residue == 3)
  • 29. Scala: кортежи (2) • (*,*,*) – тройка • каждый элемент имеет свой тип • всего кортежи объявлены до 22. • `4-ка` - объявление имени, содержащего любые спецсимволы. Удобно для математических задач, например. val triple = (1, "one", true) assert(triple._3) assert(triple._2.length == 3) val `4-ка` = (1, true, List(3,4), 1->2) assert(`4-ка`._3.head == 3) val `[0..1000)` = 0 until 1000 val `[0,10,20..1000)` = 0 until 1000 by 10
  • 34. Scala: learning curve “java без ;” collections Pattern matching implicits Covariant/contravariant type algebra время, лет мастерство … Пример JavaLike
  • 36. • Slick 3.0 – типизированный доступ к базам данных • Akka – параллельные и распределённые системы • SynapseGrid – фреймворк для описания параллельных систем реального времени (FRP) • Play – веб-фреймворк (aka «Ruby on Rails на стероидах») (есть ещё Spray, Lift, Scalatra и др.) • Apache Spark – Big Data фреймворк • Shapeless, Scalaz, Monocle – библиотеки для работы с типами высших порядков • ScalaFX – библиотека для создания GUI на основе JavaFX (есть ещё Scala-swing) • Parboiled2 – создание parser-комбинаторов • ScalaTest, Specs2 – библиотеки для создания тестов • Scala Async – библиотека для написания линейного кода с блокировками, который будет преобразован в код без блокировок • Scala.js – кросс-компилятор Scala в JavaScript Scala: библиотеки (см. github/scala-awesome)

Editor's Notes

  • #2: РИФ Created Tuesday 08 September 2015 http://www.scala-lang.org/old/node/104 - список тем Доклад "Магия Scala"/Scala Awesome Орг.вопросы Изменить название доклада Темы, которые хотелось бы раскрыть: 1. Небольшое введение предыстория языка, профессор EPFL Мартин Одерский, фотография (http://lampwww.epfl.ch/~odersky/). Scalable. http://www.slideshare.net/Odersky/scala-the-simple-parts + Hello World +trait'ы всё есть expression. Обеспечивается произвольная композиция элементов +scope'ы вместо private. Можно объявлять имена на любом уровне и они не будут засорять namespace. +минималистический унифицированный синтаксис +вывод типов кортежи +case class'ы унифицированные коллекции, +for-comprehension. +object'ы FP +immutable +concise +функции первоклассные REPL +паттерн-матчинг! Декомпозиция данных, включая сложноструктурированные. +символы/операторы - методы (пример - комплексные числа, case class, операторы) +extension-методы Зрелость языка: Язык работает в промышленном программировании и чувствует себя прекрасно. Жемчужины: http://stackoverflow.com/questions/1025181/hidden-features-of-scala - regex'ы в паттерн матчинге типы высших порядков структурные типы коллекции после преобразования автоматически правильного типа. программирование на типах +оптимизация хвостовой рекурсии async-await. И что интересно - Библиотека! (reset/shift) 2. Web Play Hello World Stateless, асинхронность, Lift, Scalatra, 3. Библиотеки -Parboiled2! Slick? Akka Synapse Grid ещё какие-то из списка Scala Awesome ScalaTest, Specs2
  • #4: - язык, разработанный профессором, вызывает доверие
  • #5: https://www.artima.com/scalazine/articles/origins_of_scala.html https://www.artima.com/scalazine/articles/goals_of_scala.html Scala is flexible. Flexibility comes at the price of simplicity (https://medium.com/@kvnwbbr/transitioning-to-scala-d1818f25b2b7) Scripting Scala is great for scripting because its type inference and functional style make it both concise and great for slicing and dicing collections etc. Applications Scala is great for writing applications because it is a statically type checked language with some great features for working in both functional and imperative styles. Scala is compatible with Java and hence you can leverage an enormous ecosystem of libraries. Enterprise Deployment Scala compiles to bytecode and runs on the Java Virtual Machine, a stable system with great performance, when compared to (so-called) dynamically typed (i.e. untyped) languages. Again, the fact that it is statically typed means that refactoring is made much easier on large codebases. (http://programmers.stackexchange.com/questions/130335/why-is-scala-more-scalable-than-other-languages)
  • #25: сокращение пространства состояний Zero debug, т.к. функция не зависит от неизвестного состояния