Size: a a a

Scala User Group

2020 August 04

Oℕ

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

Oℕ

Oleg ℕizhnik in Scala User Group
@sergey_alaev вы довольны?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Я думаю, если вы никогда не использовали GADT в предметной области вы упустили из вида серьёзную возможность добавить типобезопасность
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Это требует практики и интуиции, но однозначно полезно
источник

SA

Sergey Alaev in Scala User Group
Oleg ℕizhnik
@sergey_alaev вы довольны?
Да, спасибо. Не чтобы я стал так писать, выглядит проблемно. Но можно себе представить какой-то обобщенный код над произвольным AuthRequest, которому нужно A и не важно, что в A.
источник

SA

Sergey Alaev in Scala User Group
Конечно, можно еще тайпклассов навертеть над A. Но выглядит сложным, мне не приходит в голову задач, где такое абстрагирование окупилось бы. Возможно, нужно больше практики.
источник

Oℕ

Oleg ℕizhnik in Scala User Group
как раз не нужно тайпклассов
источник

Oℕ

Oleg ℕizhnik in Scala User Group
индексы обычно используются просто как индексы
источник

Oℕ

Oleg ℕizhnik in Scala User Group
т.е. магия, которой мы пользуемся, что внутри
case BearerAuth(token) =>
компилятор уже знает, что A = String
источник

Oℕ

Oleg ℕizhnik in Scala User Group
тайпклассы - это тема другой стороны GADT
источник

𝛈µ

𝛈 µ in Scala User Group
Oleg ℕizhnik
справедливости ради, переписывать приходилось с каждым RC
Не приходилось
источник

𝛈µ

𝛈 µ in Scala User Group
Simon
Некоторые "смелые" пустили его в прод еще год назад.
А потом пришел ZLayer. Переписывать было "весело".
Переписывать не пришлось
источник

Oℕ

Oleg ℕizhnik in Scala User Group
𝛈 µ
Не приходилось
слушай, у меня в тофу и тайпед схеме кот наплакал кода зио, и каждый ПР от скала стюарта падал, всегда нужно было руками поднимать
источник

Oℕ

Oleg ℕizhnik in Scala User Group
у меня есть пруфы в виде ПР
источник

𝛈µ

𝛈 µ in Scala User Group
А я менял одну строчку в био и не приходилось
источник

Oℕ

Oleg ℕizhnik in Scala User Group
да, в тф коде мы тоже ничего не меняли
источник

Oℕ

Oleg ℕizhnik in Scala User Group
слава ТФ
источник

𝛈µ

𝛈 µ in Scala User Group
Тф слава
источник

SA

Sergey Alaev in Scala User Group
Oleg ℕizhnik
т.е. магия, которой мы пользуемся, что внутри
case BearerAuth(token) =>
компилятор уже знает, что A = String
sealed trait AuthRequest

case class SimpleAuth(user: String, password: String) extends AuthRequest

case class BearerAuth(token: String) extends AuthRequest

case class ExternalAuth(provider: String, id: UUID) extends AuthRequest

def processAuthReq(req: AuthRequest): IO[Result] = req match {
   case SimpleAuth(user, password) => processSimpleAuth(user, password)
   case BearerAuth(token) => processBearer(token)
   case ExternalAuth(provider, id) => getExtAuthFor(provider).getAuthData(id)
}

вот, идентичный и более простой код. Без перспектив мутировать в processAll[A, B, C, D, E](req: Req[A], param: Param[B], ....)
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Sergey Alaev
sealed trait AuthRequest

case class SimpleAuth(user: String, password: String) extends AuthRequest

case class BearerAuth(token: String) extends AuthRequest

case class ExternalAuth(provider: String, id: UUID) extends AuthRequest

def processAuthReq(req: AuthRequest): IO[Result] = req match {
   case SimpleAuth(user, password) => processSimpleAuth(user, password)
   case BearerAuth(token) => processBearer(token)
   case ExternalAuth(provider, id) => getExtAuthFor(provider).getAuthData(id)
}

вот, идентичный и более простой код. Без перспектив мутировать в processAll[A, B, C, D, E](req: Req[A], param: Param[B], ....)
ну вот вы и получаете, что в итоге есть Result
источник