ЛибоТ с псевдонимом типа Scala

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

type FuEiErr[T] = Future[Either[Error, T]]
type FuEiErrInt = Future[Either[Error, Int]]

case class Error(msg: String)
def fA(x:Int): FuEiErr[Int] = Future(Right(x))  // compile error
def fB(x:Int): FuEiErr[Int] = Future(Right(x))  
// def fA(x:Int): FuEiErrInt = Future(Right(x)) // ok
// def fB(x:Int): FuEiErrInt = Future(Right(x)) 

@main def TestEitherT(): Unit = 
  (for {
    a  <- EitherT(fA(7))
    b  <- EitherT(fB(42))
  } yield { (b) }).value.map {
    case Left(err)  => println(s"Error: ${err.msg}")
    case Right(res) => println(s"Result: ${res}")
  }

Получена ошибка: «Для параметра F карты метода в классе DoesT не найден экземпляр типа Cats.Functor[F]». где: F — переменная типа с ограничением >: [X0] =>> scala.concurrent.Future[Either[Error, X0]] scala.concurrent.Future[X0] и <: [_] =>> Any

Спасибо за помощь!

Для справки: EitherT обычно является плохой идеей, и использовать кошек с Future тоже плохая идея.

Luis Miguel Mejía Suárez 03.06.2024 15:24

@LuisMiguelMejíaSuárez просто любопытно, почему? :)

Dmytro Mitin 03.06.2024 19:27

@DmytroMitin На самом деле много причин, типизированные ошибки, по моему мнению, в большинстве случаев являются плохой идеей. EitherT не очень хорошо работает с параллелизмом. Cats не дает никаких гарантий относительно порядка выполнения Future, особенно с traverse и особенно в сочетании с EitherT. Это всего лишь смесь для катастрофы. IME намного проще: просто придерживаться конкретного IO и использовать канал отказа или специальные ADT.

Luis Miguel Mejía Suárez 03.06.2024 22:17

Что ж, активно используйте DoesT в среде playframework (клиентская и серверная часть), пока никаких проблем. Future гораздо проще в использовании, чем IO, не нужна чистая функциональность, возможность отмены... Имея уже кучу библиотек для управления (+ миграция со Scala/Playframework 2 -> 3), не хотите платить цену для дополнительной зависимости и сложности с эффектом кошек (или ZIO).

RobertJo 04.06.2024 08:56

@RobertJo, ну, если хочешь использовать Future круто, делай, что хочешь. Но не путайте его с кошками, это доставит вам неприятности. Если вас вообще не волнует поведение выполнения ваших операций, в этот момент вообще не используйте Future.

Luis Miguel Mejía Suárez 04.06.2024 15:03

Для справки: последний выпуск кошек сломал traverse для Future (опять): github.com/typelevel/cats/issues/4617 - Именно такие вещи я имел в виду, когда говорил об использовании Futures с кошками. это была плохая идея - C.C. @ДмитроМитин

Luis Miguel Mejía Suárez 13.06.2024 00:37

@LuisMiguelMejíaSuárez Спасибо за ссылку. Да, Future на самом деле не монада stackoverflow.com/questions/27454798/is-future-in-scala-a-mo‌​nad Возможно, экземпляры должны быть в Alleycats.

Dmytro Mitin 13.06.2024 12:52

@DmytroMitin да, я уже пытался это сделать, но это сложная и несколько деликатная тема: github.com/typelevel/cats/pull/4182 ; нам, по крайней мере, удалось мягко объявить их устаревшими в документации: github.com/typelevel/cats/issues/4190 - TL;DR; Я участвую в крестовом походе, рассказывая всем людям, которых вижу, которые используют кошек с Future, чтобы прекратить :p

Luis Miguel Mejía Suárez 13.06.2024 14:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто параметры типа не выводились. Пытаться

for {
  a <- EitherT[Future, Error, Int](fA(7))
  b <- EitherT[Future, Error, Int](fB(42))
}

Да, если вы проверите эту историю: scastie.scala-lang.org/BalmungSan/W8Ai5HhZTXGbStcXgqSlSw/18 вы увидите, что предполагаемый тип для a — это что-то очень странное, например EitherT[[X] =>> Future[Either[Error, X] | X], Error, Int], что и приводит к сбою при вызове Functor. - Похоже, это ошибка/регрессия в компиляторе, поскольку это работает в Scala 2: scastie.scala-lang.org/BalmungSan/W8Ai5HhZTXGbStcXgqSlSw/24 мой совет @RobertoJo - открыть заявку по этому поводу

Luis Miguel Mejía Suárez 03.06.2024 15:42

Другие вопросы по теме