Scala for推导式flatMap类型定义:如何指定<-的返回类型?
Scala For推导式中FlatMap的类型匹配问题
问题代码
for { conf <- configRepository.getConf(key) info <- customRepository.getInfo(id) _ <- DBIO.from(getAdditionalInfo(info)) } yield ()
错误信息
[error] found : Seq[Either[CustomService.Error,Unit]] => slick.dbio.DBIOAction[Unit,slick.dbio.NoStream,Nothing]
[error] required: Seq[Either[CustomService.Error,Unit]] => slick.dbio.DBIOAction[Unit,slick.dbio.NoStream,E2]
解决方案
不需要把for推导式改写成flatMap链式调用,直接在for推导式内为DBIO.from(...)指定类型参数即可解决类型不兼容问题:
方式1:显式指定DBIO.from的类型参数
import slick.dbio.{Effect, NoStream, DBIOAction} for { conf <- configRepository.getConf(key) info <- customRepository.getInfo(id) _ <- DBIO.from[Seq[Either[CustomService.Error, Unit]], NoStream, Effect.All](getAdditionalInfo(info)) } yield ()
方式2:为该行标注返回类型
import slick.dbio.{Effect, NoStream, DBIOAction} for { conf <- configRepository.getConf(key) info <- customRepository.getInfo(id) _ <- DBIO.from(getAdditionalInfo(info)): DBIOAction[Unit, NoStream, Effect.All] } yield ()
问题根源是Slick的DBIOAction要求Effect类型统一,原代码中DBIO.from推导的Effect为Nothing,与前面步骤的Effect约束不匹配,显式指定类型后即可满足要求。
内容的提问来源于stack exchange,提问作者M. Barabas
相关产品推荐
相关产品推荐

