Краткое введение в Scala для разработчиков на других языках. Рассмотрены несколько простых программ, написанных с использованием красивых возможностей Scala.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
Краткое введение в Scala для разработчиков на других языках. Рассмотрены несколько простых программ, написанных с использованием красивых возможностей Scala.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
TypeScript – светлое будущее ES6 уже вчера.
Почему не "Кофе"? Чай полезней.
Что не так с Flow от Facebook?
Реальная практика использования: плюсы и минусы.
Не VisualStudio единым. Особенности работы в других IDE.
Интеграция с уже существующим JS кодом.
Использование совместно с RequireJS. Подводные камни.
Использование TypeScript совместно с React.
TypeScript и Angular.
Плюшки, которых нет в ES6/7 (пока нет): [static] enum, интерфейсы, private, protected, декораторы... Что дают и зачем?
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Языку Java присущ встроенный динамизм.
Reflection, динамическая загрузка — это то, без чего современные Java приложения просто не могут существовать, поэтому существует мнение, что AOT (статическая) компиляция вряд ли применима к Java в общем случае, а там где применима не может составить конкуренцию JIT (динамической) компиляции в плане прозводительности.
В этом докладе показывается почему это не (совсем) так, при этом рассматриваются случаи,
где у статических компиляторов действительно есть определенные сложности в обработке динамической семантики Java.
Также упоминается, где статическая компиляции для Java может быть полезна.
модель акторов и C++ что, зачем и как ?corehard_by
Модель акторов, переживающая сейчас очередную волну популярности, является очень интересным подходом к разработке сложных приложений. С помощью модели акторов было создано множество систем, написанных на языке Erlang и на базе фреймворка Akka. Но Erlang и Akka -- это управляемые среды и безопасные языки программирования. А есть ли смысл применять модель акторов в C++? Если есть, то куда смотреть и что использовать? Какие подводные камни могут поджидать на этом пути? Об этом всем и пойдет речь в докладе.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
TypeScript – светлое будущее ES6 уже вчера.
Почему не "Кофе"? Чай полезней.
Что не так с Flow от Facebook?
Реальная практика использования: плюсы и минусы.
Не VisualStudio единым. Особенности работы в других IDE.
Интеграция с уже существующим JS кодом.
Использование совместно с RequireJS. Подводные камни.
Использование TypeScript совместно с React.
TypeScript и Angular.
Плюшки, которых нет в ES6/7 (пока нет): [static] enum, интерфейсы, private, protected, декораторы... Что дают и зачем?
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Вводная лекция в язык C#, для тех кто знает программирование и в особенности C++. В статье будет уделено внимание наиболее важным отличиям языков, будут обсуждаться вопросы производительности и эффективного кода.
Другие интересные статьи по C# ищите тут: http://itw66.ru/blog/c_sharp/
Написание компактного и эффективного кода в C#: http://itw66.ru/blog/c_sharp/520.html
Языку Java присущ встроенный динамизм.
Reflection, динамическая загрузка — это то, без чего современные Java приложения просто не могут существовать, поэтому существует мнение, что AOT (статическая) компиляция вряд ли применима к Java в общем случае, а там где применима не может составить конкуренцию JIT (динамической) компиляции в плане прозводительности.
В этом докладе показывается почему это не (совсем) так, при этом рассматриваются случаи,
где у статических компиляторов действительно есть определенные сложности в обработке динамической семантики Java.
Также упоминается, где статическая компиляции для Java может быть полезна.
модель акторов и C++ что, зачем и как ?corehard_by
Модель акторов, переживающая сейчас очередную волну популярности, является очень интересным подходом к разработке сложных приложений. С помощью модели акторов было создано множество систем, написанных на языке Erlang и на базе фреймворка Akka. Но Erlang и Akka -- это управляемые среды и безопасные языки программирования. А есть ли смысл применять модель акторов в C++? Если есть, то куда смотреть и что использовать? Какие подводные камни могут поджидать на этом пути? Об этом всем и пойдет речь в докладе.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.
Implicit conversions and implicit parameters are fundamental and unique features of Scala that are powerful at the same time. To use these features to their maximum potential, and do so with confidence, you have to understand the specifics of how Scala compiler’s implicits search works. I will cover this topic in details, including ways you can optimize the implicits search algorithm in your library.
The second part of my session will focus on IntelliJ IDEA and how to leverage your IDE for working with implicits. Among other helpful IDE features, I will show how to debug implicits in IntelliJ IDEA.
As examples we’ll take a look at a few Scala libraries, including Spray with its well-known Magnet pattern.
On top of that, during my talk I’ll show you a few new tips and tricks on how to be more efficient by using IntelliJ IDEA’s hidden gems when working with Scala. "
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
Рассказ об основных принципах, которых придерживается Viber в длительной разработке приложения с большой кодовой базой — если разработкой занимается распределённая команда. Мы обсудим используемые технологии, библиотеки, работу с кодом и многое другое.
Вадим Челышов, Scala Engineer : Все ненавидят SBT Provectus
Как понятно из названия, речь пойдет про sbt – simple/scala/satan build tool. Его боятся даже сами скалисты, им пугают новичков, но в рамках моего доклада я постараюсь вернуть ему добрую честь и объясню почему это один из самых лучших билд тулов, которым вы вообще могли бы пользоваться
This presentation is devoted to Scala programming language, its perks and disadvantages, elegant solutions and hidden traps.
This presentation by Dmytro Mantula (Lead Software Engineer, GlobalLogic) was delivered at JEEConf (Kyiv) on May 23, 2015.
Семинар по Node.js в КПИ 20 октября 2014. Докладчики: Тимур Шемсединов, Никита Савченко, Максим Петренко. Краткое содержание:
* Что такое Node.js и как работает JavaScript в V8
* Профессионалы расскажут, почему они выбрали Node.js
* Вы узнаете его сильные и слабые стороны и где его лучше применять
* Будет полный обзор особеностей и внутреннего строения Node.js
* Примеры внедрения и Highload-проекты
* Вопросы развертывания, хостинг, тестирования, и отладки
* Где и что учить, что читать, как осваивать
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
Антон Кириллов, Zeptolab (Москва)
Доклад посвящен обзору ключевых технологий стека Typesafe и анализу ключевых преимуществ и недостатков на примере реального проекта:
* Действительно ли Scala - “более лучшая” Java? Что следует знать, начиная внедрять Scala.
* Play Framework: больше чем просто контейнер. Архитектура и возможности.
* Доступ к базам данных: библиотеки и подходы, эволюция схемы БД во времени
* Actors: безболезненная многопоточность!
* Simple Build Tool: не совсем simple, но крайне функциональный инструмент автоматической сборки.
Рассматриваемые технологии позволяют “из коробки” начать создавать прототипы веб-приложений за очень короткое время и в дальнейшем наращивать их функционал. Тем не менее, из-за молодости стека существует большое количество “граблей”, о которых следует знать, принимая решение об использовании данного набора технологий.
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
Talk of Julik Tarkhanov, senior backend engineer, WeTransfer, Amsterdam, at Ruby Meditation #28 Kyiv 26.10.2019
Next conference - http://www.rubymeditation.com/
It is often a choice, sometimes a whim, and sometimes an act of desperation. We idolise reuse while sometimes the road not taken is just as exciting. Let's chat about where it is appropriate to "do the thing again", take the scenic route and enjoy the view.
Announcements and conference materials https://www.fb.me/RubyMeditation
News https://twitter.com/RubyMeditation
Photos https://www.instagram.com/RubyMeditation
The stream of Ruby conferences (not just ours) https://t.me/RubyMeditation
* The channel of the organizers of the meetup https://t.me/incredevly
2. ОБО МНЕ
• Scala с 2011
• Один из организаторов встреч Scala Moscow
User Group
• Работаю в Qubell
3. О ВАС
• Кто из вас
• пишет на Java?
• слышал о Scala?
• пишет на Scala?
• слышал что такое монада?
• понимает, что монада это моноид в категории эндофункторов?
4. ЧТО ТАКОЕ SCALA
• Язык существует с 2003г.
• Scalable language
• Объединяет в себе OO и ФП-концепции
• Статически типизирован
• Компилируется в java-байткод
• Open source
5. ПЕРЕМЕННЫЕ И ЗНАЧЕНИЯ
var a: String = "foo"!
a = "bar" // разрешено!
!
val b: String = "foo"!
b = "bar" // запрещено
6. ФУНКЦИИ
def sum1(a: Int, b: Int): Int =!
a + b!
!
val sum2 =!
(a: Int, b: Int) => a + b!
!
val sum3: (Int, Int) => Int =!
(a, b) => a + b!
!
val sum4: (Int, Int) => Int =!
_ + _
7. КЛАССЫ, ОБЪЕКТЫ И
ТРЕЙТЫ
trait Dumpable {!
def dump: String!
def dump(out: PrintStream) { out.print(dump) }!
}!
!
class Foo extends Dumpable {!
override def dump = "Foo"!
}!
!
val foo = new Foo!
foo.dump(Console.out)!
!
object Bar extends Dumpable {!
override def dump = "Bar"!
}!
!
Bar.dump(Console.err)
8. СИСТЕМА ТИПОВ
• Всё есть объект:Any,AnyVal,AnyRef
• Кортежи:
scala> val tuple = (1, "a", true)!
tuple: (Int, String, Boolean) = (1,a,true)!
!
scala> tuple._2!
res0: String = a!
!
scala> val (x, y, _) = tuple!
x: Int = 1!
y: String = a
12. СОВМЕСТИМОСТЬ
• Работает на платформе JVM
• Windows, Mac, Linux,Android, кофеварки
• Отличный JIT-компилятор
• Отличный GC
• Прозрачно интегрируется с Java-кодом
• Смешанная компиляция
• Можно использовать все доступные java-библиотеки
• Старый код можно тоже не переписывать
13. ПРОИЗВОДИТЕЛЬНОСТЬ
• Какой код напишете, так и будет
• Производительность сравнима с Java
• Обычно потребляет немного больше памяти,
чем Java
16. РАЗМЕР КОДА JAVA
public class Person {!
!
private final String name;!
private final int age;!
!
public Person(String name, int age) {!
this.name = name;!
this.age = age;!
}!
!
public String getName() {!
return name;!
}!
!
public int getAge() {!
return age;!
}!
!
@Override!
public String toString() {!
return "Person(" + name + ", " + age + ")";!
}!
!
@Override!
public boolean equals(Object o) {!
if (this == o) return true;!
if (o == null || getClass() != o.getClass()) return false;!
Person person = (Person) o;!
if (age != person.age) return false;!
if (name != null ? !name.equals(person.name) : person.name != null) return false;!
return true;!
}!
!
@Override!
public int hashCode() {!
int result = name != null ? name.hashCode() : 0;!
result = 31 * result + age;!
return result;!
}!
!
}
17. РАЗМЕР КОДА SCALA
+ Метод-фабрика
+ Метод copy
+ Деконструктор для pattern matching
case class Person(name: String, age: Int)
18. РАЗМЕР ИМЕЕТ ЗНАЧЕНИЕ
• Число ошибок на строку кода — константа
слабо зависящая от языка программирования
• В поле зрения человека попадает
ограниченный объём кода
• Человек может сфокусировать внимание на
определённом объёме информации
19. ВЫВОД ТИПОВ
• Scala
! ! val list = new ListBuffer[String]()!
• Java
! ! ArrayList<String> list = new ArrayList<>();!
• Scala
! ! val set = new HashMap[String, Int]().keySet!
• Java
! ! Set<String> set = new HashMap<String, String>().keySet();!
20. OPTION
• Опциональное значение: None или Some(value)
• Многие операции можно делать не извлекая значение
• Извлечь тоже можно, но в отличие от null это
делается явно
• Все библиотеки используют этот тип
• В Java 8 тоже есть Optional
21. OPTION
val capitals = Map("Russia" -> "Moscow",!
"France" -> "Paris")!
!
val a = capitals.get("Russia")!
// Some("Moscow")!
val b = capitals.get("Italy") // None!
!
a.map(_.toUpperCase) // Some("MOSCOW")!
b.map(_.toUpperCase) // None!
!
a.getOrElse("Unknown") // "Moscow"!
b.getOrElse("Unknown") // "Unknown"!
!
for (x <- a; y <- b) yield s"$x, $y" // None
22. PATTERN MATCHING
sealed trait Shape!
case class Circle(radius: Double) extends Shape!
case class Rectangle(width: Double,!
height: Double) extends Shape!
!
val description = shape match {!
case Rectangle(w, h) if w == h =>!
s"square, side $w"!
case Rectangle(w, h) =>!
s"rectangle, $w x $h"!
case Circle(r) =>!
s"circle, radius $r"!
}
23. ПРОВЕРКА ПОЛНОТЫ
sealed trait Shape!
case class Circle(radius: Double) extends Shape!
case class Rectangle(width: Double,!
height: Double) extends Shape!
!
val description = shape match {!
case Circle(r) =>!
s"circle, radius $r"!
}!
!
pm.scala:16: match may not be exhaustive.!
It would fail on the following input: Rectangle(_, _)!
val description = shape match {!
^
24. FOR-EXPRESSIONS
case class City(name: String,!
streets: List[Street],!
population: Int)!
!
case class Street(name: String,!
sights: List[String])!
!
val cities: List[City]!
!
val plan = cities!
.filter(_.population > 1000)!
.flatMap(_.streets)!
.flatMap(s => s.sights.map(s -> _))
25. FOR-EXPRESSIONS
val plan = cities!
.filter(_.population > 1000)!
.flatMap(_.streets)!
.flatMap(s => s.sights.map(s -> _))!
!
val plan = for {!
city <- cities if city.population > 1000!
street <- city.streets!
poi <- street.sights!
} yield (street.name, poi)
26. НЕ ТОЛЬКО КОЛЛЕКЦИИ
def httpGet(url: String): Future[String] = ???!
!
def getPost(idx: Int): Future[String] =!
for {!
posts <- httpGet("http://localhost/posts")!
slug = posts.split("n")(idx)!
post <- httpGet(s"http://localhost/$slug")!
} yield post
27. AD-HOC POLYMORPHISM
trait Pretty {!
def toPrettyString: String!
}
Привет, Мартин. Ты не мог бы
отнаследовать классы стандартной
библиотеки от Pretty? Это очень
важно для нас…
33. БОРЬБА СО СЛОЖНОСТЬЮ
• Обучение → делает сложное простым
• Административные меры → запрет писать
сложный код
• Code review → понятен ли ваш код другим
• Поддержка компилятора → явное подключение
некоторых языковых конструкций
34. ENABLING LANGUAGE
FEATURES
implicit def intToString(x: Int): String = x.toString!
!
val x: String = 1
features.scala:7: implicit conversion method
intToString should be enabled by making the implicit
value scala.language.implicitConversions visible.
import scala.language.implicitConversions
35. КАДРОВЫЙ ВОПРОС
• Перейти с Java на Scala для большинства не
составляет проблемы
• Готовых Scala-разработчиков мало, но их число
растёт
• Конкуренция на рынке вакансий ниже
• Средний уровень Scala-разработчиков выше
36. КАДРОВЫЙ ВОПРОС
• Нужна небольшая талантливая команда —
Scala может оказаться предпочтительнее
• Большая команда для несложных задач —
Java будет лучшим выбором
37. УГОВОРИЛ, КАК НАЧАТЬ
• Пишите на Scala так же как на Java
• Начните с тестов
• Поощряйте «хороший» скала-код: Option вместо null,
иммутабельность
• Желательно наличие эксперта в команде
• Некоторые IDE умеют конвертировать Java код в Scala
автоматически
38. ПРОБЛЕМЫ
• Более сложные концепции
• Медленная компиляция
• Бинарная совместимость
• Недостаточная поддержка в IDE
39. ПОЛЕЗНЫЕ БИБЛИОТЕКИ
• Akka — многопоточные распределённые приложения
• Slick — работа с базами данных
• Shapeless, scalaz — выразительный и обобщённый код
• Scalatest — удобное тестирование
• SBT — система сборки
40. AKKA
• Акторы — легковесные сущности, асинхронно
обменивающиеся сообщениями
• О потоках и синхронизации заботится Akka
• Простой переход к распределённому
приложению
• Устойчивость к ошибкам
41. ПРИМЕР AKKA
class Worker extends Actor {!
!
val db = DB.connect()!
!
override def postStop() {!
db.close()!
}!
!
def receive = {!
case Query(sql) => sender() ! db.query(sql)!
}!
!
}
42. СУПЕРВИЗОР
class Supervisor extends Actor {!
!
override val supervisorStrategy =!
OneForOneStrategy(maxNrOfRetries = 10,!
withinTimeRange = 1 minute) {!
case _: IOException => Restart!
case _: Exception => Escalate!
}!
!
val worker = context.actorOf(Props[Worker])!
!
def receive = {!
case q: Query => worker forward q!
}!
!
}
45. SLICK
• Схема и запросы — обычный Scala-код
• Работа с базой данных так же проста, как с
обычными коллекциями
• Запросы типобезопасны
46. ПРИМЕР SLICK
// select NAME from COFFEES !
// where PRICE < 10.0!
// order by NAME!
coffees!
.filter(_.price < 10.0)!
.sortBy(_.name)!
.map(_.name)!
.list!
!
// Seq[String]("Cappuccino", "Espresso")
47. БИБЛИОТЕКИTYPELEVEL
• Scalaz — упрощает программирование в
функциональном стиле (монады, функторы,
линзы и другие классы типов)
• Shapeless — ещё более строгая типизация
48. SCALAZ: MONOIDS
val x = Map("a" -> List(1))!
!
val y = Map("a" -> List(2),!
"b" -> List(3))!
!
// or println(x mappend y)!
println(x |+| y)!
!
"Map(a -> List(1, 2), b -> List(3))"
50. SCALATEST
class ExampleSpec extends FreeSpec with Matchers {!
"A Stack" should "pop values in last-in-first-out order" in {!
val stack = new Stack[Int]!
stack.push(1)!
stack.push(2)!
stack.pop() should be (2)!
stack.pop() should be (1)!
}!
it should "throw NoSuchElementException if an empty stack is popped" in {!
val emptyStack = new Stack[Int]!
a [NoSuchElementException] should be thrownBy {!
emptyStack.pop()!
} !
}!
}
51. SCALATEST
$ scala -cp scalatest_2.11-2.2.0.jar org.scalatest.run ExampleSpec
Discovery starting.
Discovery completed in 21 milliseconds.
Run starting. Expected test count is: 2
ExampleSpec:
A Stack
- should pop values in last-in-first-out order
- should throw NoSuchElementException if an empty stack is popped
Run completed in 76 milliseconds.
Total number of tests run: 2
Suites: completed 1, aborted 0
Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
All tests passed.
52. ASSERTIONS
scala> assert(a == b || c >= d)
org.scalatest.exceptions.TestFailedException:
1 did not equal 2, and 3 was not greater than or equal to 4
at ...
!
scala> assert(Some(2).isEmpty)
org.scalatest.exceptions.TestFailedException:
Some(2) was not empty
at ...
53. DIAGRAMMED ASSERTIONS
scala> assert(a == b || c >= d)
org.scalatest.exceptions.TestFailedException:
!
assert(a == b || c >= d)
| | | | | | |
1 | 2 | 3 | 4
| | false
| false
false
!
at ...