Size: a a a

Scala User Group

2020 September 25

λ

λoλcat in Scala User Group
Вывод: вариантные ебифункторы опасны для человеков
источник

λ

λoλdog in Scala User Group
Видел сеньора, который пишет на тофу,  а Волгу не пишет
источник

V

Vλadimir in Scala User Group
λoλcat
Видел сеньора, который пишет на ZIO с тремя дырками, а вариантность не понимает.
Мы же не работаем с тобой
источник

λ

λoλcat in Scala User Group
Vλadimir
Мы же не работаем с тобой
Так я тебя и не взял
источник

V

Vλadimir in Scala User Group
λoλcat
Так я тебя и не взял
Я знал что это ты меня завалил
источник
2020 September 26

Oℕ

Oleg ℕizhnik in Scala User Group
Simon
У меня есть подтверждение, что TF опасен для человеков!
Собеседовал сеньера, который который был уверен, что context bounds работает только для тайп-конструкторов! То есть для F[_]: Monad работает, а вот для T: Encoder - нет и надо через implicit ev: Encoder[T] писать.
смешно
источник

λƒ

λesha ƒomkin in Scala User Group
λoλcat
Видел сеньора, который пишет на ZIO с тремя дырками, а вариантность не понимает.
Вчера прочитал этот твит и не мог уснуть до тех пор пока не осознал что не понимаю вариантность :(
источник

λ

λoλdog in Scala User Group
но это не твит
источник

S

Simon in Scala User Group
В 140 символов влезает. Утиную типизацию проходит.
источник

λƒ

λesha ƒomkin in Scala User Group
λoλdog
но это не твит
Не придирайся.
источник

D

Daniel in Scala User Group
λoλcat
Видел сеньора, который пишет на ZIO с тремя дырками, а вариантность не понимает.
Щас бы у сеньоров про вариантность спрашивать
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Сам иногда вариантность не понимаю
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Вроде и понимаю, а иногда думаю, что нет
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Но я зато ещё один трюк нашёл
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Где вариантность даёт то, что в хошкеле сложна
источник

D

Deλ✨ in Scala User Group
Расскажи
источник

S

Simon in Scala User Group
Oleg ℕizhnik
Но я зато ещё один трюк нашёл
заинтриговал и убежал
источник

Oℕ

Oleg ℕizhnik in Scala User Group
В последнее время меня увлекают фишки с HKD.
Если ты делаешь простой интерпретатор чего-то типизированного, часто ты делаешь две отдельные ветки твоих выражений - типизированные и нетипизированные.
Нетипизированная форма удобная для чтения-сохранения, типизированная для интерпретации.
Между ними - тайпчек и стирание.
Т.к. они часто выглядят очень похоже, возникает желание запихнуть их в один тип.
Можно представить это как sealed trait Expr[A],  типизированной формой будет Expr[Type], нетипизированной - Expr[Unit]
Далее иногда ты хочешь воспользоваться системой типов scala, для того, чтобы удобно работать с индексированными структурами и гарантировать, что тайпчекнутая форма не может иметь некорректного построения
Тогда ты можешь получить что-то вроде Expr[F[_], A], A - это собственно твой индекс, отвечающий соответствующему типу выражения, а F[_] - тайп-параметр, различающий типизированную и нетипизированную форму.
F[x] = Unit для нетипизированной и F[x] = x для типизированной.
Тогда к примеру case class Expr[F[_], A](term: Term[A], typ: F[Type[A]]) и Term - какой-то adt вроде имеющий например конструктор
case class App[F[_], A, B](lam : Expr[F, A => B], arg : Expr[F, A]) extends Term[F, B]

Ну и в общем трюк состоит в том, чтобы сделать Expr[+F[_], A], а
type Untyped[A] = Any, type Typed[A] = A

Тогда оказывается, что Typed <: Untyped , и в то время, как при чтении ты всё ещё можешь заполнять места для Untyped[Type[A]] каким-то Unit
Но Expr[Typed, A] <: Expr[Untyped, A], т.е. стирание в обратную сторону - это просто забывание, что там что-то полезное стояло на местах с типами, и его можно делать без полного обхода.
источник

S

Simon in Scala User Group
Интересно, надо попробовать.
А в чем здесь смысл разделения на Expr и Term? Почему бы не сделать Expr корнем adt?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
ну это для примера
источник