Вы пытаетесь сопоставить с шаблоном внутри для понимания (хотя это выглядит только как невинное объявление типа). Но для сопоставления с образцом внутри для понимания требуется реализация withFilter
(подумайте, что должно произойти, если сопоставление с образцом не удастся?). Так что удалите сопоставление по типам, и оно должно работать:
def update(userId: Long, user: User) = {
(for {
_ <- EitherT(updateUser(userId, user))
user <- EitherT(findById(userId))
userProfile <- EitherT(userProfileRepository.findById(user.userProfileId))
} yield (user, userProfile).map {
case (user: User, userProfile: UserProfile) =>
val response = new UserResponse(user, userProfile)
Right(response)
case error =>
val str = s"update failure: $error"
Left(str)
}
}