Forwarded from Scala Nishtyaki Channel
Сейф инит флаг возможно будет добавлен в Дотти, ПР смотреть тут
https://github.com/lampepfl/dotty/pull/7789
https://github.com/lampepfl/dotty/pull/7789
GitHub
Safe initialization for Scala by liufengyun · Pull Request #7789 · lampepfl/dotty
This PR implements experimental safe initialization check for Scala, which can be enabled by the compiler option -Ycheck-init.
A Quick Glance
Parent-Child Interaction
Given the following code snipp...
A Quick Glance
Parent-Child Interaction
Given the following code snipp...
Начинаем понедельник с определений терминов из ФП от Дегуза. Определения максимально понятные и без зауми.
Очень крутой фрагмент определения монадки:
«Monads represent the essence of imperative programming: do a first thing, and then do this second thing, which depends on the value computed by the first thing.»
http://degoes.net/articles/fp-glossary
Очень крутой фрагмент определения монадки:
«Monads represent the essence of imperative programming: do a first thing, and then do this second thing, which depends on the value computed by the first thing.»
http://degoes.net/articles/fp-glossary
Forwarded from Scala bin
Похоже, что новый год начинается с очередных синтаксических предложений [1, 2] от доктора Одерски, на этот раз в отношении extension методов в Dotty. Первое позволяет именам методов начинаться с точки, в то время как второе вводит новое ключевое слово
До:
После значимой табуляции и изменений в синтаксисе присваивания (последние добавлены не были), данные изменения видятся гораздо менее спорными и, возможно, имеют реальные шансы в конечном итоге оказаться в Dotty.
extension
(of
) для определения таких методов взамен имеющемуся синтаксису с given
.До:
given listOps: [T](xs: List[T]) extended with {...}
После:extension listOps of [T](xs: List[T]) with {...}
После значимой табуляции и изменений в синтаксисе присваивания (последние добавлены не были), данные изменения видятся гораздо менее спорными и, возможно, имеют реальные шансы в конечном итоге оказаться в Dotty.
GitHub
Syntax Change: Allow '.' in front of extension method by odersky · Pull Request #7914 · lampepfl/dotty
Allow
def (c: Circle).circumference: Double
alongside
def (c: Circle) circumference: Double
The syntax with '.' is preferred for normal methods which have names
starting with a le...
def (c: Circle).circumference: Double
alongside
def (c: Circle) circumference: Double
The syntax with '.' is preferred for normal methods which have names
starting with a le...
Отличный монадный туториал:
https://www.chrisstucchio.com/blog/2013/write_some_fucking_code.html
Абсолютно правильная мысль про то, что нет смысла переусложнять изучение ФП паттернов огромной теоретической базой и осмыслением абстракций. Родина дала флэтмап — композишь асинхронщину.
А уже потом при желании и необходимости осознаёшь математический смысл монадок. И для большинства разработчиков нет необходимости в понимании не только теорката, но даже и того, как ZIO и фьючи реализованы в коде.
https://www.chrisstucchio.com/blog/2013/write_some_fucking_code.html
Абсолютно правильная мысль про то, что нет смысла переусложнять изучение ФП паттернов огромной теоретической базой и осмыслением абстракций. Родина дала флэтмап — композишь асинхронщину.
А уже потом при желании и необходимости осознаёшь математический смысл монадок. И для большинства разработчиков нет необходимости в понимании не только теорката, но даже и того, как ZIO и фьючи реализованы в коде.
В ZIO очень круто сделаны ретраи
Из коробки есть стратегии повторений, покрывающие большинство потребностей, при этом комбинаторы отлично композируются и позволяют легко выстраивать стратегии на все случаи жизни.
Чтобы сказать ZIO «у меня есть функция, которая может зафейлиться, мне нужно в случае ошибки повторить её 5 раз с экспоненциально растущей задержкой, начиная с 1 секунды», достаточно написать
Очень удобно обрабатывать сетевые ошибки при взаимодействии со сторонними сервисами в случаях, когда circuit breaker излишен.
Вот только документации маловато, надеюсь, к 1.0 завезут
Из коробки есть стратегии повторений, покрывающие большинство потребностей, при этом комбинаторы отлично композируются и позволяют легко выстраивать стратегии на все случаи жизни.
Чтобы сказать ZIO «у меня есть функция, которая может зафейлиться, мне нужно в случае ошибки повторить её 5 раз с экспоненциально растущей задержкой, начиная с 1 секунды», достаточно написать
myComplicatedAction.retry(Schedule.recurs(5) && Schedule.exponential(1.second))
Очень удобно обрабатывать сетевые ошибки при взаимодействии со сторонними сервисами в случаях, когда circuit breaker излишен.
Вот только документации маловато, надеюсь, к 1.0 завезут
Ólafur Páll Geirsson из scalameta сделал новую библиотеку для юнит-тестов на скале. Называется MUnit, представляет из себя минималистичное апи поверх JUnit. Всё сделано на ассертах, с простейшими фикстурами и поддержкой асинхронных вычислений в тестах.
Проект неспроста делается под эгидой скаламеты: сообщения об ошибках выглядят гораздо лучше, чем в других библиотеках, благодаря красивым диффам и подсветке нужных строчек в стектрейсах.
Прямо сейчас тащить в зависимости рановато: мало комбинаторов, не идеальная интеграция с IDEA, ещё не завезли параллельное исполнение тестов. Но все проекты scalameta потихоньку переводятся на MUnit, так что шероховатости скоро допилят.
Очень понравилось, что с этой библиотекой в принципе не нужно разбираться. Просто берёшь и без задней мысли пишешь тесты. ScalaTest в этом плане проигрывает, потому что требует изучения DSL и подглядывания в документацию. Надеюсь, что MUnit через пару релизов сможет составить ему конкуренцию.
https://scalameta.org/munit/
Проект неспроста делается под эгидой скаламеты: сообщения об ошибках выглядят гораздо лучше, чем в других библиотеках, благодаря красивым диффам и подсветке нужных строчек в стектрейсах.
Прямо сейчас тащить в зависимости рановато: мало комбинаторов, не идеальная интеграция с IDEA, ещё не завезли параллельное исполнение тестов. Но все проекты scalameta потихоньку переводятся на MUnit, так что шероховатости скоро допилят.
Очень понравилось, что с этой библиотекой в принципе не нужно разбираться. Просто берёшь и без задней мысли пишешь тесты. ScalaTest в этом плане проигрывает, потому что требует изучения DSL и подглядывания в документацию. Надеюсь, что MUnit через пару релизов сможет составить ему конкуренцию.
https://scalameta.org/munit/
Подумал, что serverless — плохой термин для интуитивного понимания технологии. Понятнее было бы слово serviceless, потому что сервер там вполне себе есть, а вот (микро)сервис как раз упраздняется.
Forwarded from Scala Nishtyaki Channel
Скала опросник от скала центра, велком заполнять для поддержания статистики https://airtable.com/shrDCOpnMP8iA6kOn
В джаву завезли нормальный http клиент! Только недавно узнал, что с 11 версии JDK можно наконец-то по человечески писать http запросы. В предыдущих версиях для простейшего запроса надо осуществить ряд совершенно нелицеприятных действий с максимально низкоуровневым апи.
Вроде и круто, но хороший клиент в стандартной либе полезен в первую очередь для написания библиотек без зависимостей. Только вот их не получится подключить к проектам на Java 8 😠
В итоге в приложениях этот клиент использовать резона особо нет, потому что под JVM уже написана куча сторонних клиентов на любой вкус, а в библиотеках всё равно придётся писать на старом апи ради совместимости со старой JDK.
https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html
Вроде и круто, но хороший клиент в стандартной либе полезен в первую очередь для написания библиотек без зависимостей. Только вот их не получится подключить к проектам на Java 8 😠
В итоге в приложениях этот клиент использовать резона особо нет, потому что под JVM уже написана куча сторонних клиентов на любой вкус, а в библиотеках всё равно придётся писать на старом апи ради совместимости со старой JDK.
https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html
Блогпост про самые значимые улучшения Scala-тулинга в 2019 https://geirsson.com/2019.html
Прошлый год вообще был очень продуктивным в части развития инструментов вокруг скалы: IDEA, coursier, sbt, metals, Scala Steward стали работать гораздо лучше. Из поста примечателен Polynote — аналог Jupyter Notebook для скалы от Нетфликса.
Прошлый год вообще был очень продуктивным в части развития инструментов вокруг скалы: IDEA, coursier, sbt, metals, Scala Steward стали работать гораздо лучше. Из поста примечателен Polynote — аналог Jupyter Notebook для скалы от Нетфликса.
Приятно видеть, что в Котлине исправлены старые ошибки Скалы. Например, тайпалиасы:
Ещё из-за того, что слово
И да, есть ещё type members, но это другое. И то, что для них используется то же ключевое слово, что и для тайпалиасов, точно не делает язык проще.
// kotlinВроде бы просто именование ключевого слова, но благодаря нему сразу понятно, что создаётся не новый полноценный тип, который будет проверяться компилятором, а просто альтернативное название для уже существующего.
typealias UserId = String
// Scala
type UserId = String
Ещё из-за того, что слово
type
в Скале уже занято, полноценные ньютайпы пришлось назвать opaque type
. В результате у более полезной сущности будет сложное название из двух слов.И да, есть ещё type members, но это другое. И то, что для них используется то же ключевое слово, что и для тайпалиасов, точно не делает язык проще.
Forwarded from dd if=/dev/stuff of=/dev/tg
https://scalacenter.github.io/scala-developer-survey-2019 — результаты опроса от Scala Center за 2019 год подъехали.
Интересно, что Metals показал достаточно высокий процент использования! Это только укрепляет мою точку зрения, что за LSP будущее.
Интересно, что Metals показал достаточно высокий процент использования! Это только укрепляет мою точку зрения, что за LSP будущее.
Вышли записи докладов с f(by), в том числе рассказ Jamie Thompson из Scala Center про TASTy: формат описания синтаксического дерева скалы с информацией о типах. Особенно радует обещанная благодаря нему совместимость 2.13.2 и грядущей 3.0. Это значит, что библиотеки, написанные под 2.13.2 смогут использоваться из третьей скалы и наоборот.
https://youtu.be/YQmVrUdx8TU
Остальные видео с конференции в плейлисте: https://www.youtube.com/playlist?list=PLpVeA1tdgfCBwyzQBKz52ZDnrZTHeuTLc
https://youtu.be/YQmVrUdx8TU
Остальные видео с конференции в плейлисте: https://www.youtube.com/playlist?list=PLpVeA1tdgfCBwyzQBKz52ZDnrZTHeuTLc
Наткнулся на достаточно странную библиотеку baker — это надстройка над Akka для высокоуровневого описания стриминговых операций.
Вместо того, чтобы руками работать со стримами или акторами, поднимаемся на следующий уровень абстракции, где описываем типы данных, событий и трансформаций. Потом конструируем граф, который можно запустить, а можно отрисовать в графвизе.
Апи получается в разы более простое (и ограниченное), чем у голой акки. А ещё библиотека вроде как умеет персистить состояние графа.
Мне непонятно, в какой ситуации я захочу такой фреймворк: для сложной стриминговой обработки обычно нужно больше контроля над происходящим, а для простых графов не нужны стримы.
А ещё там реализация трансформаций сопоставляется с их интерфейсами в рантайме по строковым айдишкам.
Вместо того, чтобы руками работать со стримами или акторами, поднимаемся на следующий уровень абстракции, где описываем типы данных, событий и трансформаций. Потом конструируем граф, который можно запустить, а можно отрисовать в графвизе.
Апи получается в разы более простое (и ограниченное), чем у голой акки. А ещё библиотека вроде как умеет персистить состояние графа.
Мне непонятно, в какой ситуации я захочу такой фреймворк: для сложной стриминговой обработки обычно нужно больше контроля над происходящим, а для простых графов не нужны стримы.
А ещё там реализация трансформаций сопоставляется с их интерфейсами в рантайме по строковым айдишкам.
Закинул свой первый PR в scalameta — библиотеку для парсинга и анализа Scala кода. Починил занимательный баг четырёхлетней давности.
В скале есть тип
и добавить в конец этого списка ещё один Unit
В этом коде круглые скобки будут означать вызов метода
Ещё один способ сконструировать список через инфиксную конкатенацию и Nil в конце. Тут круглые скобки — это значения типа
🤯🤯🤯
Тут круглые скобки — это значение типа
PR с фиксом: https://github.com/scalameta/scalameta/pull/1995/files
Потыкаться в AST: https://astexplorer.net/#/gist/c271ab0e59bdfa39fcb00b493ce517a5/2e367460bdad51d2879ad1336287fa1b89564816
Как компилятор парсит инфиксные применения с юнитами: https://github.com/scala/scala/pull/7684/files
В скале есть тип
Unit
, использующийся как аналог void
из Java или C. Но, в отличие от них, Unit
— это полноценный тип, имеющий единственно возможное значение ()
. Соответственно, любознательный программист может спокойно сделать список юнитов:
@ val xs = List((), (), ())
xs: List[Unit] = List((), (), ())
и добавить в конец этого списка ещё один Unit
@ xs :+ ()
res1: List[Unit] = List((), (), (), ())
В этом коде круглые скобки будут означать вызов метода
:+
на списке xs
. Потом компилятор «дорисует» уже Unit внутрь этих скобок. То есть если убрать синтаксический сахар, мы имеем xs.:+(())
. А с точки зрения синтаксиса те скобки, которые написал программист — это никакой не Unit
, а скобки списка аргументов. Пока всё ок — scalameta парсит код правильно, и в её AST имеется Term.ApplyInfix
с пустым списком аргументов. Но давайте продолжим извращения:
@ () :: () :: Nil
res2: List[Unit] = List((), ())
Ещё один способ сконструировать список через инфиксную конкатенацию и Nil в конце. Тут круглые скобки — это значения типа
Unit
, и scalameta всё ещё парсит их корректно. А теперь воспользуемся возможностями компилятора по полной:
@ xs == () :: Nil
res3: Boolean = false
🤯🤯🤯
Тут круглые скобки — это значение типа
Unit
, которое склеивается в список, а потом сравнивается со списком юнитов в переменной xs
. И на этом scalameta обламывалась: она пыталась распарсить скобки как список аргументов, но из-за этого ломался обход цепочки инфиксных операторов и вылетал эксепшн.PR с фиксом: https://github.com/scalameta/scalameta/pull/1995/files
Потыкаться в AST: https://astexplorer.net/#/gist/c271ab0e59bdfa39fcb00b493ce517a5/2e367460bdad51d2879ad1336287fa1b89564816
Как компилятор парсит инфиксные применения с юнитами: https://github.com/scala/scala/pull/7684/files
В диссертации Роя Филдинга про архитектуру сетевых приложений увидел забавное обозначение кешей символом $. А всё потому что cache созвучно с cash.
Сама диссертация интересна не только классификацией сетевых архитектур, но и первым описанием REST. А Рой Филдинг один их тех людей, которые спроектировали современный интернет.
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
Сама диссертация интересна не только классификацией сетевых архитектур, но и первым описанием REST. А Рой Филдинг один их тех людей, которые спроектировали современный интернет.
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
Forwarded from Scala bin
После порядком затянувшегося перерыва решил попробовать написать что-то и на английском языке.
Итогом стала статья на Medium про использование
Искренне надеюсь, что дебют получился успешным. Буду очень рад вашим комментариям.
Итогом стала статья на Medium про использование
Ordering
в Scala. Примером стало, конечно же, любимое сообществом семейство кошачьих.Искренне надеюсь, что дебют получился успешным. Буду очень рад вашим комментариям.
Medium
Sorting in Scala — a cat shop example
While Java and Scala both inhabit the same JVM grounds, the latter has become known as a far more concise and expressive language due to…
В следующей версии cats не надо будет импортировать инстансы тайпклассов для типов из стандартной библиотеки!
Это изменение — огромный шаг для cats в направлении от библиотеки для ФП к «батарейкам» для стандартный библиотеки.
Сейчас, чтобы написать
А ещё нововведения Scala 3 в целом располагают к такому дизайну библиотек.
Лайкнуть PR Трэвиса Брауна можно здесь: https://github.com/typelevel/cats/pull/3043
Это изменение — огромный шаг для cats в направлении от библиотеки для ФП к «батарейкам» для стандартный библиотеки.
Сейчас, чтобы написать
@ List(Some(1), None, Some(3)).combineAll
res4: Option[Int] = Some(4)
надо либо импортировать вообще всю библиотеку в своё пространство имён через import cats.implicits._
, либо написать 4 (!) совершенно неудобных импортаimport cats.syntax.foldable._что напрочь убивает выгоду от использования котов в этом месте. В следующей версии будет достаточно подтянуть только
import cats.instances.list._
import cats.instances.option._
import cats.instances.int._
import cats.syntax.foldable._
или просто import cats.syntax.all._
, и
это прекрасно.А ещё нововведения Scala 3 в целом располагают к такому дизайну библиотек.
Лайкнуть PR Трэвиса Брауна можно здесь: https://github.com/typelevel/cats/pull/3043
Ребята из Profunctor Optics запустили сервис публикации вакансий: profunctor.io / @profunctor_jobs
Надеюсь, он сможет постепенно заместить айтишные чаты с вакансиями в телеге, которые непременно скатываются в срачи и травлю рекрутеров
Надеюсь, он сможет постепенно заместить айтишные чаты с вакансиями в телеге, которые непременно скатываются в срачи и травлю рекрутеров
Есть в тайпскрипте библиотека, которая генерирует типизированную модельку конфига по самой конфигурации в JSON — https://github.com/tusharmath/node-config-ts
А скалисты с лицами лягушек описывают классы с моделью конфигов руками. Вот бы кто-нибудь сделал кодогенератор, который парсит HOCON и выдаёт кейсклассы с его моделью…🙄
Понятно, что на развесистых конфигурациях захочется самостоятельно описывать модели, но для простых сервисов с небольшой конфигурацией можно и нагенерить.
А скалисты с лицами лягушек описывают классы с моделью конфигов руками. Вот бы кто-нибудь сделал кодогенератор, который парсит HOCON и выдаёт кейсклассы с его моделью…🙄
Понятно, что на развесистых конфигурациях захочется самостоятельно описывать модели, но для простых сервисов с небольшой конфигурацией можно и нагенерить.