Telegram Web Link
Начинаем понедельник с определений терминов из ФП от Дегуза. Определения максимально понятные и без зауми.

Очень крутой фрагмент определения монадки:
«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. Первое позволяет именам методов начинаться с точки, в то время как второе вводит новое ключевое слово extension (of) для определения таких методов взамен имеющемуся синтаксису с given.

До:
given listOps: [T](xs: List[T]) extended with {...}

После:
extension listOps of [T](xs: List[T]) with {...}


После значимой табуляции и изменений в синтаксисе присваивания (последние добавлены не были), данные изменения видятся гораздо менее спорными и, возможно, имеют реальные шансы в конечном итоге оказаться в Dotty.
Отличный монадный туториал:

https://www.chrisstucchio.com/blog/2013/write_some_fucking_code.html

Абсолютно правильная мысль про то, что нет смысла переусложнять изучение ФП паттернов огромной теоретической базой и осмыслением абстракций. Родина дала флэтмап — композишь асинхронщину.

А уже потом при желании и необходимости осознаёшь математический смысл монадок. И для большинства разработчиков нет необходимости в понимании не только теорката, но даже и того, как ZIO и фьючи реализованы в коде.
В ZIO очень круто сделаны ретраи

Из коробки есть стратегии повторений, покрывающие большинство потребностей, при этом комбинаторы отлично композируются и позволяют легко выстраивать стратегии на все случаи жизни.

Чтобы сказать 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/
Подумал, что 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
Блогпост про самые значимые улучшения Scala-тулинга в 2019 https://geirsson.com/2019.html

Прошлый год вообще был очень продуктивным в части развития инструментов вокруг скалы: IDEA, coursier, sbt, metals, Scala Steward стали работать гораздо лучше. Из поста примечателен Polynote — аналог Jupyter Notebook для скалы от Нетфликса.
Приятно видеть, что в Котлине исправлены старые ошибки Скалы. Например, тайпалиасы:

// kotlin
typealias UserId = String
// Scala
type UserId = String

Вроде бы просто именование ключевого слова, но благодаря нему сразу понятно, что создаётся не новый полноценный тип, который будет проверяться компилятором, а просто альтернативное название для уже существующего.

Ещё из-за того, что слово type в Скале уже занято, полноценные ньютайпы пришлось назвать opaque type. В результате у более полезной сущности будет сложное название из двух слов.

И да, есть ещё type members, но это другое. И то, что для них используется то же ключевое слово, что и для тайпалиасов, точно не делает язык проще.
https://scalacenter.github.io/scala-developer-survey-2019 — результаты опроса от Scala Center за 2019 год подъехали.
Интересно, что 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
Наткнулся на достаточно странную библиотеку baker — это надстройка над Akka для высокоуровневого описания стриминговых операций.

Вместо того, чтобы руками работать со стримами или акторами, поднимаемся на следующий уровень абстракции, где описываем типы данных, событий и трансформаций. Потом конструируем граф, который можно запустить, а можно отрисовать в графвизе.

Апи получается в разы более простое (и ограниченное), чем у голой акки. А ещё библиотека вроде как умеет персистить состояние графа.

Мне непонятно, в какой ситуации я захочу такой фреймворк: для сложной стриминговой обработки обычно нужно больше контроля над происходящим, а для простых графов не нужны стримы.

А ещё там реализация трансформаций сопоставляется с их интерфейсами в рантайме по строковым айдишкам.
Закинул свой первый PR в scalameta — библиотеку для парсинга и анализа Scala кода. Починил занимательный баг четырёхлетней давности.

В скале есть тип 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
Forwarded from Scala bin
После порядком затянувшегося перерыва решил попробовать написать что-то и на английском языке.

Итогом стала статья на Medium про использование Ordering в Scala. Примером стало, конечно же, любимое сообществом семейство кошачьих.

Искренне надеюсь, что дебют получился успешным. Буду очень рад вашим комментариям.
В следующей версии cats не надо будет импортировать инстансы тайпклассов для типов из стандартной библиотеки!

Это изменение — огромный шаг для 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 и выдаёт кейсклассы с его моделью…🙄

Понятно, что на развесистых конфигурациях захочется самостоятельно описывать модели, но для простых сервисов с небольшой конфигурацией можно и нагенерить.
2025/07/11 18:06:19
Back to Top
HTML Embed Code: