Lil Functor
795 subscribers
57 photos
1 file
183 links
Pure functional and composable channel

Чат: https://t.iss.one/+L-xb_m_4lnY3Y2Fi
Download Telegram
Вышли записи докладов с 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 и выдаёт кейсклассы с его моделью…🙄

Понятно, что на развесистых конфигурациях захочется самостоятельно описывать модели, но для простых сервисов с небольшой конфигурацией можно и нагенерить.
Олаф из скаламеты написал отличный пост про этикет в опенсорсе — https://geirsson.com/open-source.html

Особенно хочется отметить пункт про коллабораторов — Олаф не жадничает на мейнтейнерские права, поэтому в скаламетовских проектах автобусный фактор сведён к минимуму, и даже в небольших репозиториях всегда есть кому посмотреть пулл-реквест.

Пункт про вредность good first contribution тоже справедливый: обычно проектам нужны люди, решающие собственные проблемы, либо заинтересованные в долгосрочном вкладе. Такие люди привлекаются не лейблами на задачах. Ещё вспомнилась сиутация, когда я поставил «good first contribution» на задачу, человек отправил пулл-реквест с её решением (первый для него), а потом в ходе дискуссии с другими мейнтейнерами было решено его отклонить. В итоге у человека обломался его первый вклад, и больше от него ничего не было видно. Очень неприятный момент :с

А если кто-то всё-таки хочет поконтрибутить в самый популярный форматировщик кода на скале и не знает, с чего начать, пишите -> @poslegm. Есть много задач разной степени сложности :^)
Forwarded from PONV Daily (λoλcat)
Очень удобный дебаггер для макросов, печатающий во время компиляции код, отформатированный scalafmt. Печатает только те раскрытия макросов, которые обернуты в macrolizer.show {...}. Поддержка только скалы 2.13. ⬇️
Совсем упустил из виду шикарное нововведение скалы 2.13.1: автоматическая конвертация обычных функций в частичные.

Пусть есть метод, принимающий частичную функцию:

Try(42).recover {
case e: IllegalArgumentException => 1
case e: DatabaseError => 2
}

В прошлых версиях языка, даже если мы передаём в такой метод тотальную функцию, всё равно приходилось писать единственный case, который не несёт никакой смысловой нагрузки:

Try(42).recover { case e => e.getMessage }

А после PR от Dale Wijnand можно писать гораздо проще:

Try(42).recover(_.getMessage)

Компилятор сам преобразует обычную лямбду _.getMessage в частичную функцию с одним case.

Пример взят из презентации Dale про проблемы частичных функций в скале: https://dwijnand.github.io/talk-fix-partialfunction/, которую я выцепил сегодня в скалачате
Forwarded from Scala bin
Из-за многочисленных перестановок долго не знал, сложится или нет, но буквально несколько дней назад всё окончательно утвердилось. В эту субботу буду выступать на онлайн-митапе с обзорной презентацией про Scala, ФП и почему это важно.

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

Мероприятие будет проходить на английском языке в эту субботу, в 13:30 по Московскому времени. Принять участие можно, зарегистрировавшись по ссылке. (Меня клятвенно заверили, что, несмотря на надпись на сайте, "вместимость" мероприятия - 100 человек)
Наверное, самое крутое, что втащили в скалу 2.13.2 — это аннотация @nowarn, которая подавляет ворнинги компилятора на конкретном выражении. А то подключать к каждому второму проекту плагин silencer порядком раздражает (к слову, именно этот плагин и внедрили в компилятор)
В блоге разработчиков скалы вышел пост о сообщениях компилятора Scala 3 при не найденных имплиситах.
Компилятор будет не просто отображать понятное сообщение об ошибке с полной цепочкой поиска (наконец-то!), но и подсказывать импорт, который надо скопипастить, чтобы нужный имплисит появился в скоупе.

Будет круто, если у этой фичи появится поддержка на уровне IDE, которая будет сама дописывать все импорты.

https://www.scala-lang.org/blog/2020/05/05/scala-3-import-suggestions.html
У компании Lunatech есть WIP курс на гитхабе по изучению возможностей Scala 3 путём пошагового обновления небольшого проекта на Scala 2. Одна фича — одно упражнение.

https://github.com/lunatech-labs/lunatech-scala-2-to-scala3-course

А ScalaCenter готовит подробный migration guide — https://github.com/scalacenter/scala-3-migration-guide
ZIO бесспорно один из лучших инструментов для разработки на Scala. Но стоит понимать, что когда Дегуз критикует Akka в пользу ZIO, это разговор не только о подходах к конкарренси в программировании, но и о конкуренции консалтинговой компании Ziverge с консалтинговой компанией Lightbend 😉
Забавный блогпост от SoftwareMill о том, как дефолтные настройки кафки ломают её гарантию сохранения порядка сообщений в одной партиции.

Вроде как все знают, что если нужен порядок, то надо ставить
max.in.flight.requests.per.connection=1
(или отключать ретраи продюсера). Но дефолтный конфиг, нарушающий одну из гарантий системы — это странно.

https://blog.softwaremill.com/does-kafka-really-guarantee-the-order-of-messages-3ca849fd19d2
Собрал материалы по инъекции зависимостей в скале c ZIO. ZLayer пока совсем свежая технология, поэтому систематических обучающих материалов по ней пока нет. Но уже набралось приличное количество руководств от разных авторов.

Документация

ZLayer
Use modules and layers
Macros

Блогпосты

🛠Adam Warski — Managing dependencies using ZIO
🛠Pavels Sisojevs — From idea to product with ZLayer
🛠aappddeevv — zio layers and framework integration
🛠Tim Pigden — Example of ZLayers being used in combination
🛠Juliano Alves — ZIO + Http4s: a simple API client

Слайды к докладам

👨‍🎓Adam Fraser — Solving The Dependency Injection Problem With ZIO
👨‍🎓Pierangelo Cecchetto — Ray tracing with ZIO-ZLayer