Size: a a a

Scala User Group

2020 October 11

N

Nadia in Scala User Group
RAFIZ
Functional Programming principles ?
источник

E

Elijah in Scala User Group
@liorl00 этот вариант будет попредпочтительнее + в скала 3 для него добавят сахара и это будет красивее выглядеть. детальнее о том, что здесь происходит можно почитать здесь
источник

E

Elijah in Scala User Group
Elijah
@liorl00 этот вариант будет попредпочтительнее + в скала 3 для него добавят сахара и это будет красивее выглядеть. детальнее о том, что здесь происходит можно почитать здесь
а это о том, как будет в скала 3

https://youtu.be/orTmm6OMaLw
источник

KC

Kain Crow in Scala User Group
Elijah
@liorl00 этот вариант будет попредпочтительнее + в скала 3 для него добавят сахара и это будет красивее выглядеть. детальнее о том, что здесь происходит можно почитать здесь
Ну это при условии что классы свои (чел же писал что они уже есть) и что семантика позволяет их (и только их) в один силдтрейт запихнуть. Хотя наверное если надо передать в один метод, то позволяет, ну мало ли.
источник

E

Elijah in Scala User Group
Kain Crow
Ну это при условии что классы свои (чел же писал что они уже есть) и что семантика позволяет их (и только их) в один силдтрейт запихнуть. Хотя наверное если надо передать в один метод, то позволяет, ну мало ли.
ну можно и просто метод оверлоаднуть вот так

https://scastie.scala-lang.org/9cbaXlZZSReWZborRztvFA
источник
2020 October 12

К

Крис in Scala User Group
Друзья, посоветуйте, пожалуйста, новичку курсы или литературу. В Scalа недавно совсем, но очень хочу в нём развиваться. К сожалению, пока что даже о достоинствах языка не могу говорить, но имею желание разобраться
источник

OD

Omni Directional in Scala User Group
курсера
источник

OP

Oleksiy Pavlikovsky in Scala User Group
Крис
Друзья, посоветуйте, пожалуйста, новичку курсы или литературу. В Scalа недавно совсем, но очень хочу в нём развиваться. К сожалению, пока что даже о достоинствах языка не могу говорить, но имею желание разобраться
https://github.com/scala-russian/about/blob/master/README.md
Советую Essenঞal Scala, потом Scala with cats. Потом, что хочешь.
источник

OP

Oleksiy Pavlikovsky in Scala User Group
А курсеру, не рекомендую.
источник

OD

Omni Directional in Scala User Group
почему? курсера достаточно базовый курс для новичков, не смотря на всю академичность
источник

К

Крис in Scala User Group
Благодарю
источник

В

Вагнер in Scala User Group
Omni Directional
почему? курсера достаточно базовый курс для новичков, не смотря на всю академичность
functional programming  principles ?
источник

λƒ

λesha ƒomkin in Scala User Group
Крис
Друзья, посоветуйте, пожалуйста, новичку курсы или литературу. В Scalа недавно совсем, но очень хочу в нём развиваться. К сожалению, пока что даже о достоинствах языка не могу говорить, но имею желание разобраться
Можно быстро вкатиться с помощью этого https://www.scala-exercises.org/scala_tutorial/terms_and_types
источник

AD

Apache DOG™ in Scala User Group
А есть дженеричное решение в виде https://habr.com/ru/company/tinkoff/blog/147759/
источник

К

Крис in Scala User Group
Спасибо большое
источник

AS

Aλexander Semenov in Scala User Group
А Intellij пока Scala 3 никак не умеет? Ну там всякие opaque type, enum, given...
источник

AS

Aleksei Shashev in Scala User Group
Может кто решал такую задачу или может есть готовое решение, а я просто плохо искал?
источник

AS

Aleksei Shashev in Scala User Group
Переслано от Aleksei Shashev
Всем привет, подскажите, как можно удобне решить следующее. Нужна сумма типов. Конкретнее, метод-обработчик HTTP запроса может вренуть один из возможных вариантов данных. Каждый вариант представленным своим типом (case class). Одни и те же типы могут возвращаться разными методами обработчиками. Из-за этого, чтобы можон было исопльзовать представление суммы типов через sealed trait нужно или кейс классы наследовать от несколкьих трейтов, а это выглядит странно в том числе семматически, так как в данные просачивается инородная информация вида, какой метод их возвращает/принимает. Другой вариант - создавать sealed trait и кейс классы обертки, которые будут заключать в себя исходные кейс классы, лучше, но обилие однообразного кода удручает.
Пока наиболее интересным выглядит Coproduct из Shapless. Но если конвертировать case  class в Coproduct содержащие этот тип и потом накинуть для этого Json кодер/енкодер понятно как, то как сделать обработку Coproduct элегантно у меня вызвало затруднение. Из идей собственно использовать петрн матчинг с Inl/Inr, в принципе это решает проблему + есть проверка компилятором на полноту матчинга, но выглядит немного криво:
  type Type = Foo :+: Bar :+: Qoo :+: CNil

 def handler1(g: Group): Unit = g match {
   case Inl(foo)            => ???
   case Inr(Inl(bar))       => ???
   case Inr(Inr(Inl(qoo)))  => ???
   case Inr(Inr(Inr(cnil))) => cnil.impossible
 }

Понимаю как сделать объекты с unapply, чтобы получилоcь что-то типа:

  def handler2(g: Group): Unit = {
   val GetFoo = GetElement[Foo]
   val GetBar = GetElement[Bar]
   val GetQoo = GetElement[Qoo]

   g match {
     case GetFoo(foo) => ???
     case GetBar(bar) => ???
     case GetQoo(qoo) => ???
   }
 }


или обощенного обработчика в который "добавляются" обработчики для конкретного типа:

  def handler3(g: Group): Unit = {
   val hnd = new HandlerBuilder[Unit]
     .add[Foo](_ => ())
     .add[Bar](_ => ())
     .add[Qoo](_ => ())
     .result()

   hnd(g)
 }

Но тут теряется проверка на полноту, то обработали все кейсы на этапе компиляции. Ну и еще вариант писать через Selector, который возращает Option.

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

Используемая версия скалы - 2.13.
источник

AD

Apache DOG™ in Scala User Group
Aleksei Shashev
Переслано от Aleksei Shashev
Всем привет, подскажите, как можно удобне решить следующее. Нужна сумма типов. Конкретнее, метод-обработчик HTTP запроса может вренуть один из возможных вариантов данных. Каждый вариант представленным своим типом (case class). Одни и те же типы могут возвращаться разными методами обработчиками. Из-за этого, чтобы можон было исопльзовать представление суммы типов через sealed trait нужно или кейс классы наследовать от несколкьих трейтов, а это выглядит странно в том числе семматически, так как в данные просачивается инородная информация вида, какой метод их возвращает/принимает. Другой вариант - создавать sealed trait и кейс классы обертки, которые будут заключать в себя исходные кейс классы, лучше, но обилие однообразного кода удручает.
Пока наиболее интересным выглядит Coproduct из Shapless. Но если конвертировать case  class в Coproduct содержащие этот тип и потом накинуть для этого Json кодер/енкодер понятно как, то как сделать обработку Coproduct элегантно у меня вызвало затруднение. Из идей собственно использовать петрн матчинг с Inl/Inr, в принципе это решает проблему + есть проверка компилятором на полноту матчинга, но выглядит немного криво:
  type Type = Foo :+: Bar :+: Qoo :+: CNil

 def handler1(g: Group): Unit = g match {
   case Inl(foo)            => ???
   case Inr(Inl(bar))       => ???
   case Inr(Inr(Inl(qoo)))  => ???
   case Inr(Inr(Inr(cnil))) => cnil.impossible
 }

Понимаю как сделать объекты с unapply, чтобы получилоcь что-то типа:

  def handler2(g: Group): Unit = {
   val GetFoo = GetElement[Foo]
   val GetBar = GetElement[Bar]
   val GetQoo = GetElement[Qoo]

   g match {
     case GetFoo(foo) => ???
     case GetBar(bar) => ???
     case GetQoo(qoo) => ???
   }
 }


или обощенного обработчика в который "добавляются" обработчики для конкретного типа:

  def handler3(g: Group): Unit = {
   val hnd = new HandlerBuilder[Unit]
     .add[Foo](_ => ())
     .add[Bar](_ => ())
     .add[Qoo](_ => ())
     .result()

   hnd(g)
 }

Но тут теряется проверка на полноту, то обработали все кейсы на этапе компиляции. Ну и еще вариант писать через Selector, который возращает Option.

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

Используемая версия скалы - 2.13.
на копродуктах можно применять polyfunction
источник

AD

Apache DOG™ in Scala User Group
Шейплс-макросы все проверят.
источник