playedMatches <- teamOpt.map(team => playedMatchesRepository.findByTeamId(team.id)) // findByTeamId returns EitherT[Future, String, Seq[PlayedMatches]]
здесь вы получаете опцию [EitherT [Future, String, Seq [PlayedMatches]]], которая не сочетается с EitherT [Future, String, ???], который вы используете в качестве монады длядля понимания.
один вариант, который у вас есть, заключается в том, чтобы фактически использовать сгиб в teamOpt.
teamOpt.fold(EitherT(Future.successful(Left("Team not Found"): Either[String, Team]))){ team => playedMatchesRepository.findByTeamId(team.id) }
Таким образом, вы разворачиваете опцию с ошибкой, если она пуста, или с успехом, еслине пусто.(создайте функцию, которая принимает teamOPt в качестве параметра, и понимание будет выглядеть намного лучше)
Надеюсь, что это поможет
update В случае пустого регистра будет успешными будьте счастливы, возвращая пустую последовательность:
teamOpt.fold(
EitherT(Future.successful(Right(Seq()): Either[String, Seq[PlayedMatches]))
){ team =>
playedMatchesRepository.findByTeamId(team.id)
}