我的技术栈是
我正在尝试实现此功能以更新数据库中的行
def update(userId: Long, user: User) = {
(for {
_ <- EitherT(updateUser(userId, user))
user: User <- EitherT(findById(userId))
userProfile: 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)
}
}
但是当我尝试使用EitherT编译此代码时,我会得到
value withFilter不是cats.data.EitherT的成员
答案 0 :(得分:6)
您正在尝试在理解中进行模式匹配(尽管它看起来只是无辜的类型声明)。但是,对于全面理解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)
}
}